diff --git a/Cargo.lock b/Cargo.lock index f8bf1e5bc2..3ddd4e278f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4934,6 +4934,7 @@ dependencies = [ "prost", "protos", "queue-msg", + "scroll-codec", "scroll-rpc", "scroll-verifier", "serde", @@ -5378,11 +5379,13 @@ dependencies = [ "base64 0.21.7", "cosmwasm-std", "ethereum-verifier", + "ethers-core", "hex", "ics008-wasm-client", "protos", "rlp", "schemars", + "scroll-codec", "scroll-verifier", "serde", "serde-json-wasm 1.0.1", @@ -5412,8 +5415,11 @@ name = "scroll-verifier" version = "0.1.0" dependencies = [ "ethereum-verifier", + "ethers-core", "hex", + "hex-literal", "rlp", + "scroll-codec", "serde", "serde-utils", "serde_json", diff --git a/generated/rust/protos/Cargo.toml b/generated/rust/protos/Cargo.toml index 5bc8917e91..02234f2e75 100644 --- a/generated/rust/protos/Cargo.toml +++ b/generated/rust/protos/Cargo.toml @@ -273,6 +273,7 @@ proto_full = [ "union+ibc+lightclients+cometbls+v1", "union+ibc+lightclients+ethereum+v1", "union+ibc+lightclients+scroll+v1", + "union+ics23+v1", "union+staking+v1", ] "tendermint+abci" = ["google+protobuf", "tendermint+crypto", "tendermint+types"] @@ -305,6 +306,7 @@ proto_full = [ ] "union+ibc+lightclients+ethereum+v1" = ["ibc+core+client+v1", "ibc+lightclients+tendermint+v1"] "union+ibc+lightclients+scroll+v1" = ["ibc+core+client+v1", "union+ibc+lightclients+ethereum+v1"] +"union+ics23+v1" = [] "union+staking+v1" = ["cosmos+staking+v1beta1"] ## @@protoc_insertion_point(features) client = ["tonic"] diff --git a/generated/rust/protos/src/cosmos.authz.v1beta1.rs b/generated/rust/protos/src/cosmos.authz.v1beta1.rs index 24aaf73dcb..d141a8c4ab 100644 --- a/generated/rust/protos/src/cosmos.authz.v1beta1.rs +++ b/generated/rust/protos/src/cosmos.authz.v1beta1.rs @@ -71,6 +71,48 @@ impl ::prost::Name for GrantQueueItem { ::prost::alloc::format!("cosmos.authz.v1beta1.{}", Self::NAME) } } +/// EventGrant is emitted on Msg/Grant +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventGrant { + /// Msg type URL for which an autorization is granted + #[prost(string, tag = "2")] + pub msg_type_url: ::prost::alloc::string::String, + /// Granter account address + #[prost(string, tag = "3")] + pub granter: ::prost::alloc::string::String, + /// Grantee account address + #[prost(string, tag = "4")] + pub grantee: ::prost::alloc::string::String, +} +impl ::prost::Name for EventGrant { + const NAME: &'static str = "EventGrant"; + const PACKAGE: &'static str = "cosmos.authz.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.authz.v1beta1.{}", Self::NAME) + } +} +/// EventRevoke is emitted on Msg/Revoke +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventRevoke { + /// Msg type URL for which an autorization is revoked + #[prost(string, tag = "2")] + pub msg_type_url: ::prost::alloc::string::String, + /// Granter account address + #[prost(string, tag = "3")] + pub granter: ::prost::alloc::string::String, + /// Grantee account address + #[prost(string, tag = "4")] + pub grantee: ::prost::alloc::string::String, +} +impl ::prost::Name for EventRevoke { + const NAME: &'static str = "EventRevoke"; + const PACKAGE: &'static str = "cosmos.authz.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.authz.v1beta1.{}", Self::NAME) + } +} /// GenesisState defines the authz module's genesis state. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -195,48 +237,6 @@ impl ::prost::Name for QueryGranteeGrantsResponse { ::prost::alloc::format!("cosmos.authz.v1beta1.{}", Self::NAME) } } -/// EventGrant is emitted on Msg/Grant -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventGrant { - /// Msg type URL for which an autorization is granted - #[prost(string, tag = "2")] - pub msg_type_url: ::prost::alloc::string::String, - /// Granter account address - #[prost(string, tag = "3")] - pub granter: ::prost::alloc::string::String, - /// Grantee account address - #[prost(string, tag = "4")] - pub grantee: ::prost::alloc::string::String, -} -impl ::prost::Name for EventGrant { - const NAME: &'static str = "EventGrant"; - const PACKAGE: &'static str = "cosmos.authz.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.authz.v1beta1.{}", Self::NAME) - } -} -/// EventRevoke is emitted on Msg/Revoke -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventRevoke { - /// Msg type URL for which an autorization is revoked - #[prost(string, tag = "2")] - pub msg_type_url: ::prost::alloc::string::String, - /// Granter account address - #[prost(string, tag = "3")] - pub granter: ::prost::alloc::string::String, - /// Grantee account address - #[prost(string, tag = "4")] - pub grantee: ::prost::alloc::string::String, -} -impl ::prost::Name for EventRevoke { - const NAME: &'static str = "EventRevoke"; - const PACKAGE: &'static str = "cosmos.authz.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.authz.v1beta1.{}", Self::NAME) - } -} /// MsgGrant is a request type for Grant method. It declares authorization to the grantee /// on behalf of the granter with the provided expiration time. #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/generated/rust/protos/src/cosmos.bank.v1beta1.rs b/generated/rust/protos/src/cosmos.bank.v1beta1.rs index cc114ed55a..3cadd86b3f 100644 --- a/generated/rust/protos/src/cosmos.bank.v1beta1.rs +++ b/generated/rust/protos/src/cosmos.bank.v1beta1.rs @@ -1,4 +1,28 @@ // @generated +/// SendAuthorization allows the grantee to spend up to spend_limit coins from +/// the granter's account. +/// +/// Since: cosmos-sdk 0.43 +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SendAuthorization { + #[prost(message, repeated, tag = "1")] + pub spend_limit: ::prost::alloc::vec::Vec, + /// allow_list specifies an optional list of addresses to whom the grantee can send tokens on behalf of the + /// granter. If omitted, any recipient is allowed. + /// + /// Since: cosmos-sdk 0.47 + #[prost(string, repeated, tag = "2")] + pub allow_list: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +impl ::prost::Name for SendAuthorization { + const NAME: &'static str = "SendAuthorization"; + const PACKAGE: &'static str = "cosmos.bank.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.bank.v1beta1.{}", Self::NAME) + } +} /// Params defines the parameters for the bank module. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] @@ -649,6 +673,49 @@ impl ::prost::Name for QueryDenomOwnersResponse { ::prost::alloc::format!("cosmos.bank.v1beta1.{}", Self::NAME) } } +/// QueryDenomOwnersByQueryRequest defines the request type for the DenomOwnersByQuery RPC query, +/// which queries for a paginated set of all account holders of a particular +/// denomination. +/// +/// Since: cosmos-sdk 0.50.3 +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryDenomOwnersByQueryRequest { + /// denom defines the coin denomination to query all account holders for. + #[prost(string, tag = "1")] + pub denom: ::prost::alloc::string::String, + /// pagination defines an optional pagination for the request. + #[prost(message, optional, tag = "2")] + pub pagination: ::core::option::Option, +} +impl ::prost::Name for QueryDenomOwnersByQueryRequest { + const NAME: &'static str = "QueryDenomOwnersByQueryRequest"; + const PACKAGE: &'static str = "cosmos.bank.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.bank.v1beta1.{}", Self::NAME) + } +} +/// QueryDenomOwnersByQueryResponse defines the RPC response of a DenomOwnersByQuery RPC query. +/// +/// Since: cosmos-sdk 0.50.3 +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryDenomOwnersByQueryResponse { + #[prost(message, repeated, tag = "1")] + pub denom_owners: ::prost::alloc::vec::Vec, + /// pagination defines the pagination in the response. + #[prost(message, optional, tag = "2")] + pub pagination: ::core::option::Option, +} +impl ::prost::Name for QueryDenomOwnersByQueryResponse { + const NAME: &'static str = "QueryDenomOwnersByQueryResponse"; + const PACKAGE: &'static str = "cosmos.bank.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.bank.v1beta1.{}", Self::NAME) + } +} /// QuerySendEnabledRequest defines the RPC request for looking up SendEnabled entries. /// /// Since: cosmos-sdk 0.47 @@ -692,30 +759,6 @@ impl ::prost::Name for QuerySendEnabledResponse { ::prost::alloc::format!("cosmos.bank.v1beta1.{}", Self::NAME) } } -/// SendAuthorization allows the grantee to spend up to spend_limit coins from -/// the granter's account. -/// -/// Since: cosmos-sdk 0.43 -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct SendAuthorization { - #[prost(message, repeated, tag = "1")] - pub spend_limit: ::prost::alloc::vec::Vec, - /// allow_list specifies an optional list of addresses to whom the grantee can send tokens on behalf of the - /// granter. If omitted, any recipient is allowed. - /// - /// Since: cosmos-sdk 0.47 - #[prost(string, repeated, tag = "2")] - pub allow_list: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -impl ::prost::Name for SendAuthorization { - const NAME: &'static str = "SendAuthorization"; - const PACKAGE: &'static str = "cosmos.bank.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.bank.v1beta1.{}", Self::NAME) - } -} /// MsgSend represents a message to send coins from one account to another. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/generated/rust/protos/src/cosmos.bank.v1beta1.tonic.rs b/generated/rust/protos/src/cosmos.bank.v1beta1.tonic.rs index 0f66f4385c..ca4e419335 100644 --- a/generated/rust/protos/src/cosmos.bank.v1beta1.tonic.rs +++ b/generated/rust/protos/src/cosmos.bank.v1beta1.tonic.rs @@ -308,6 +308,30 @@ pub mod query_client { .insert(GrpcMethod::new("cosmos.bank.v1beta1.Query", "DenomOwners")); self.inner.unary(req, path, codec).await } + pub async fn denom_owners_by_query( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner.ready().await.map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/cosmos.bank.v1beta1.Query/DenomOwnersByQuery", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "cosmos.bank.v1beta1.Query", + "DenomOwnersByQuery", + )); + self.inner.unary(req, path, codec).await + } pub async fn send_enabled( &mut self, request: impl tonic::IntoRequest, diff --git a/generated/rust/protos/src/cosmos.base.node.v1beta1.rs b/generated/rust/protos/src/cosmos.base.node.v1beta1.rs index 4afe1c22c1..1ae1833f35 100644 --- a/generated/rust/protos/src/cosmos.base.node.v1beta1.rs +++ b/generated/rust/protos/src/cosmos.base.node.v1beta1.rs @@ -16,11 +16,12 @@ impl ::prost::Name for ConfigRequest { pub struct ConfigResponse { #[prost(string, tag = "1")] pub minimum_gas_price: ::prost::alloc::string::String, - /// pruning settings #[prost(string, tag = "2")] pub pruning_keep_recent: ::prost::alloc::string::String, #[prost(string, tag = "3")] pub pruning_interval: ::prost::alloc::string::String, + #[prost(uint64, tag = "4")] + pub halt_height: u64, } impl ::prost::Name for ConfigResponse { const NAME: &'static str = "ConfigResponse"; diff --git a/generated/rust/protos/src/cosmos.evidence.v1beta1.rs b/generated/rust/protos/src/cosmos.evidence.v1beta1.rs index 0ef314bc73..b5b19056a0 100644 --- a/generated/rust/protos/src/cosmos.evidence.v1beta1.rs +++ b/generated/rust/protos/src/cosmos.evidence.v1beta1.rs @@ -1,19 +1,4 @@ // @generated -/// GenesisState defines the evidence module's genesis state. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GenesisState { - /// evidence defines all the evidence at genesis. - #[prost(message, repeated, tag = "1")] - pub evidence: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for GenesisState { - const NAME: &'static str = "GenesisState"; - const PACKAGE: &'static str = "cosmos.evidence.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.evidence.v1beta1.{}", Self::NAME) - } -} /// Equivocation implements the Evidence interface and defines evidence of double /// signing misbehavior. #[allow(clippy::derive_partial_eq_without_eq)] @@ -39,6 +24,21 @@ impl ::prost::Name for Equivocation { ::prost::alloc::format!("cosmos.evidence.v1beta1.{}", Self::NAME) } } +/// GenesisState defines the evidence module's genesis state. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GenesisState { + /// evidence defines all the evidence at genesis. + #[prost(message, repeated, tag = "1")] + pub evidence: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for GenesisState { + const NAME: &'static str = "GenesisState"; + const PACKAGE: &'static str = "cosmos.evidence.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.evidence.v1beta1.{}", Self::NAME) + } +} /// QueryEvidenceRequest is the request type for the Query/Evidence RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/generated/rust/protos/src/cosmos.group.v1.rs b/generated/rust/protos/src/cosmos.group.v1.rs index cb6032b38e..bf5ed11d92 100644 --- a/generated/rust/protos/src/cosmos.group.v1.rs +++ b/generated/rust/protos/src/cosmos.group.v1.rs @@ -467,6 +467,171 @@ impl ProposalExecutorResult { } } } +/// EventCreateGroup is an event emitted when a group is created. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventCreateGroup { + /// group_id is the unique ID of the group. + #[prost(uint64, tag = "1")] + pub group_id: u64, +} +impl ::prost::Name for EventCreateGroup { + const NAME: &'static str = "EventCreateGroup"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventUpdateGroup is an event emitted when a group is updated. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventUpdateGroup { + /// group_id is the unique ID of the group. + #[prost(uint64, tag = "1")] + pub group_id: u64, +} +impl ::prost::Name for EventUpdateGroup { + const NAME: &'static str = "EventUpdateGroup"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventCreateGroupPolicy is an event emitted when a group policy is created. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventCreateGroupPolicy { + /// address is the account address of the group policy. + #[prost(string, tag = "1")] + pub address: ::prost::alloc::string::String, +} +impl ::prost::Name for EventCreateGroupPolicy { + const NAME: &'static str = "EventCreateGroupPolicy"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventUpdateGroupPolicy is an event emitted when a group policy is updated. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventUpdateGroupPolicy { + /// address is the account address of the group policy. + #[prost(string, tag = "1")] + pub address: ::prost::alloc::string::String, +} +impl ::prost::Name for EventUpdateGroupPolicy { + const NAME: &'static str = "EventUpdateGroupPolicy"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventSubmitProposal is an event emitted when a proposal is created. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventSubmitProposal { + /// proposal_id is the unique ID of the proposal. + #[prost(uint64, tag = "1")] + pub proposal_id: u64, +} +impl ::prost::Name for EventSubmitProposal { + const NAME: &'static str = "EventSubmitProposal"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventWithdrawProposal is an event emitted when a proposal is withdrawn. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventWithdrawProposal { + /// proposal_id is the unique ID of the proposal. + #[prost(uint64, tag = "1")] + pub proposal_id: u64, +} +impl ::prost::Name for EventWithdrawProposal { + const NAME: &'static str = "EventWithdrawProposal"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventVote is an event emitted when a voter votes on a proposal. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventVote { + /// proposal_id is the unique ID of the proposal. + #[prost(uint64, tag = "1")] + pub proposal_id: u64, +} +impl ::prost::Name for EventVote { + const NAME: &'static str = "EventVote"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventExec is an event emitted when a proposal is executed. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventExec { + /// proposal_id is the unique ID of the proposal. + #[prost(uint64, tag = "1")] + pub proposal_id: u64, + /// result is the proposal execution result. + #[prost(enumeration = "ProposalExecutorResult", tag = "2")] + pub result: i32, + /// logs contains error logs in case the execution result is FAILURE. + #[prost(string, tag = "3")] + pub logs: ::prost::alloc::string::String, +} +impl ::prost::Name for EventExec { + const NAME: &'static str = "EventExec"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventLeaveGroup is an event emitted when group member leaves the group. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventLeaveGroup { + /// group_id is the unique ID of the group. + #[prost(uint64, tag = "1")] + pub group_id: u64, + /// address is the account address of the group member. + #[prost(string, tag = "2")] + pub address: ::prost::alloc::string::String, +} +impl ::prost::Name for EventLeaveGroup { + const NAME: &'static str = "EventLeaveGroup"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} +/// EventProposalPruned is an event emitted when a proposal is pruned. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventProposalPruned { + /// proposal_id is the unique ID of the proposal. + #[prost(uint64, tag = "1")] + pub proposal_id: u64, + /// status is the proposal status (UNSPECIFIED, SUBMITTED, ACCEPTED, REJECTED, ABORTED, WITHDRAWN). + #[prost(enumeration = "ProposalStatus", tag = "2")] + pub status: i32, + /// tally_result is the proposal tally result (when applicable). + #[prost(message, optional, tag = "3")] + pub tally_result: ::core::option::Option, +} +impl ::prost::Name for EventProposalPruned { + const NAME: &'static str = "EventProposalPruned"; + const PACKAGE: &'static str = "cosmos.group.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) + } +} /// GenesisState defines the group module's genesis state. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -984,171 +1149,6 @@ impl ::prost::Name for QueryGroupsResponse { ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) } } -/// EventCreateGroup is an event emitted when a group is created. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventCreateGroup { - /// group_id is the unique ID of the group. - #[prost(uint64, tag = "1")] - pub group_id: u64, -} -impl ::prost::Name for EventCreateGroup { - const NAME: &'static str = "EventCreateGroup"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventUpdateGroup is an event emitted when a group is updated. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventUpdateGroup { - /// group_id is the unique ID of the group. - #[prost(uint64, tag = "1")] - pub group_id: u64, -} -impl ::prost::Name for EventUpdateGroup { - const NAME: &'static str = "EventUpdateGroup"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventCreateGroupPolicy is an event emitted when a group policy is created. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventCreateGroupPolicy { - /// address is the account address of the group policy. - #[prost(string, tag = "1")] - pub address: ::prost::alloc::string::String, -} -impl ::prost::Name for EventCreateGroupPolicy { - const NAME: &'static str = "EventCreateGroupPolicy"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventUpdateGroupPolicy is an event emitted when a group policy is updated. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventUpdateGroupPolicy { - /// address is the account address of the group policy. - #[prost(string, tag = "1")] - pub address: ::prost::alloc::string::String, -} -impl ::prost::Name for EventUpdateGroupPolicy { - const NAME: &'static str = "EventUpdateGroupPolicy"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventSubmitProposal is an event emitted when a proposal is created. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventSubmitProposal { - /// proposal_id is the unique ID of the proposal. - #[prost(uint64, tag = "1")] - pub proposal_id: u64, -} -impl ::prost::Name for EventSubmitProposal { - const NAME: &'static str = "EventSubmitProposal"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventWithdrawProposal is an event emitted when a proposal is withdrawn. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventWithdrawProposal { - /// proposal_id is the unique ID of the proposal. - #[prost(uint64, tag = "1")] - pub proposal_id: u64, -} -impl ::prost::Name for EventWithdrawProposal { - const NAME: &'static str = "EventWithdrawProposal"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventVote is an event emitted when a voter votes on a proposal. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventVote { - /// proposal_id is the unique ID of the proposal. - #[prost(uint64, tag = "1")] - pub proposal_id: u64, -} -impl ::prost::Name for EventVote { - const NAME: &'static str = "EventVote"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventExec is an event emitted when a proposal is executed. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventExec { - /// proposal_id is the unique ID of the proposal. - #[prost(uint64, tag = "1")] - pub proposal_id: u64, - /// result is the proposal execution result. - #[prost(enumeration = "ProposalExecutorResult", tag = "2")] - pub result: i32, - /// logs contains error logs in case the execution result is FAILURE. - #[prost(string, tag = "3")] - pub logs: ::prost::alloc::string::String, -} -impl ::prost::Name for EventExec { - const NAME: &'static str = "EventExec"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventLeaveGroup is an event emitted when group member leaves the group. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventLeaveGroup { - /// group_id is the unique ID of the group. - #[prost(uint64, tag = "1")] - pub group_id: u64, - /// address is the account address of the group member. - #[prost(string, tag = "2")] - pub address: ::prost::alloc::string::String, -} -impl ::prost::Name for EventLeaveGroup { - const NAME: &'static str = "EventLeaveGroup"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} -/// EventProposalPruned is an event emitted when a proposal is pruned. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventProposalPruned { - /// proposal_id is the unique ID of the proposal. - #[prost(uint64, tag = "1")] - pub proposal_id: u64, - /// status is the proposal status (UNSPECIFIED, SUBMITTED, ACCEPTED, REJECTED, ABORTED, WITHDRAWN). - #[prost(enumeration = "ProposalStatus", tag = "2")] - pub status: i32, - /// tally_result is the proposal tally result (when applicable). - #[prost(message, optional, tag = "3")] - pub tally_result: ::core::option::Option, -} -impl ::prost::Name for EventProposalPruned { - const NAME: &'static str = "EventProposalPruned"; - const PACKAGE: &'static str = "cosmos.group.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.group.v1.{}", Self::NAME) - } -} /// MsgCreateGroup is the Msg/CreateGroup request type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/generated/rust/protos/src/cosmos.nft.v1beta1.rs b/generated/rust/protos/src/cosmos.nft.v1beta1.rs index 3058fd1707..4d7c126d5e 100644 --- a/generated/rust/protos/src/cosmos.nft.v1beta1.rs +++ b/generated/rust/protos/src/cosmos.nft.v1beta1.rs @@ -1,4 +1,70 @@ // @generated +/// EventSend is emitted on Msg/Send +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventSend { + /// class_id associated with the nft + #[prost(string, tag = "1")] + pub class_id: ::prost::alloc::string::String, + /// id is a unique identifier of the nft + #[prost(string, tag = "2")] + pub id: ::prost::alloc::string::String, + /// sender is the address of the owner of nft + #[prost(string, tag = "3")] + pub sender: ::prost::alloc::string::String, + /// receiver is the receiver address of nft + #[prost(string, tag = "4")] + pub receiver: ::prost::alloc::string::String, +} +impl ::prost::Name for EventSend { + const NAME: &'static str = "EventSend"; + const PACKAGE: &'static str = "cosmos.nft.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.nft.v1beta1.{}", Self::NAME) + } +} +/// EventMint is emitted on Mint +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventMint { + /// class_id associated with the nft + #[prost(string, tag = "1")] + pub class_id: ::prost::alloc::string::String, + /// id is a unique identifier of the nft + #[prost(string, tag = "2")] + pub id: ::prost::alloc::string::String, + /// owner is the owner address of the nft + #[prost(string, tag = "3")] + pub owner: ::prost::alloc::string::String, +} +impl ::prost::Name for EventMint { + const NAME: &'static str = "EventMint"; + const PACKAGE: &'static str = "cosmos.nft.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.nft.v1beta1.{}", Self::NAME) + } +} +/// EventBurn is emitted on Burn +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventBurn { + /// class_id associated with the nft + #[prost(string, tag = "1")] + pub class_id: ::prost::alloc::string::String, + /// id is a unique identifier of the nft + #[prost(string, tag = "2")] + pub id: ::prost::alloc::string::String, + /// owner is the owner address of the nft + #[prost(string, tag = "3")] + pub owner: ::prost::alloc::string::String, +} +impl ::prost::Name for EventBurn { + const NAME: &'static str = "EventBurn"; + const PACKAGE: &'static str = "cosmos.nft.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.nft.v1beta1.{}", Self::NAME) + } +} /// Class defines the class of the nft type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -326,72 +392,6 @@ impl ::prost::Name for QueryClassesResponse { ::prost::alloc::format!("cosmos.nft.v1beta1.{}", Self::NAME) } } -/// EventSend is emitted on Msg/Send -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventSend { - /// class_id associated with the nft - #[prost(string, tag = "1")] - pub class_id: ::prost::alloc::string::String, - /// id is a unique identifier of the nft - #[prost(string, tag = "2")] - pub id: ::prost::alloc::string::String, - /// sender is the address of the owner of nft - #[prost(string, tag = "3")] - pub sender: ::prost::alloc::string::String, - /// receiver is the receiver address of nft - #[prost(string, tag = "4")] - pub receiver: ::prost::alloc::string::String, -} -impl ::prost::Name for EventSend { - const NAME: &'static str = "EventSend"; - const PACKAGE: &'static str = "cosmos.nft.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.nft.v1beta1.{}", Self::NAME) - } -} -/// EventMint is emitted on Mint -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventMint { - /// class_id associated with the nft - #[prost(string, tag = "1")] - pub class_id: ::prost::alloc::string::String, - /// id is a unique identifier of the nft - #[prost(string, tag = "2")] - pub id: ::prost::alloc::string::String, - /// owner is the owner address of the nft - #[prost(string, tag = "3")] - pub owner: ::prost::alloc::string::String, -} -impl ::prost::Name for EventMint { - const NAME: &'static str = "EventMint"; - const PACKAGE: &'static str = "cosmos.nft.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.nft.v1beta1.{}", Self::NAME) - } -} -/// EventBurn is emitted on Burn -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventBurn { - /// class_id associated with the nft - #[prost(string, tag = "1")] - pub class_id: ::prost::alloc::string::String, - /// id is a unique identifier of the nft - #[prost(string, tag = "2")] - pub id: ::prost::alloc::string::String, - /// owner is the owner address of the nft - #[prost(string, tag = "3")] - pub owner: ::prost::alloc::string::String, -} -impl ::prost::Name for EventBurn { - const NAME: &'static str = "EventBurn"; - const PACKAGE: &'static str = "cosmos.nft.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.nft.v1beta1.{}", Self::NAME) - } -} /// MsgSend represents a message to send a nft from one account to another account. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/generated/rust/protos/src/cosmos.staking.v1beta1.rs b/generated/rust/protos/src/cosmos.staking.v1beta1.rs index d9e8780345..8babd46b98 100644 --- a/generated/rust/protos/src/cosmos.staking.v1beta1.rs +++ b/generated/rust/protos/src/cosmos.staking.v1beta1.rs @@ -1,4 +1,104 @@ // @generated +/// StakeAuthorization defines authorization for delegate/undelegate/redelegate. +/// +/// Since: cosmos-sdk 0.43 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StakeAuthorization { + /// max_tokens specifies the maximum amount of tokens can be delegate to a validator. If it is + /// empty, there is no spend limit and any amount of coins can be delegated. + #[prost(message, optional, tag = "1")] + pub max_tokens: ::core::option::Option, + /// authorization_type defines one of AuthorizationType. + #[prost(enumeration = "AuthorizationType", tag = "4")] + pub authorization_type: i32, + /// validators is the oneof that represents either allow_list or deny_list + #[prost(oneof = "stake_authorization::Validators", tags = "2, 3")] + pub validators: ::core::option::Option, +} +/// Nested message and enum types in `StakeAuthorization`. +pub mod stake_authorization { + /// Validators defines list of validator addresses. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ValidatorsList { + #[prost(string, repeated, tag = "1")] + pub address: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + impl ::prost::Name for ValidatorsList { + const NAME: &'static str = "Validators"; + const PACKAGE: &'static str = "cosmos.staking.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.staking.v1beta1.StakeAuthorization.{}", Self::NAME) + } + } + /// validators is the oneof that represents either allow_list or deny_list + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Validators { + /// allow_list specifies list of validator addresses to whom grantee can delegate tokens on behalf of granter's + /// account. + #[prost(message, tag = "2")] + AllowList(ValidatorsList), + /// deny_list specifies list of validator addresses to whom grantee can not delegate tokens. + #[prost(message, tag = "3")] + DenyList(ValidatorsList), + } +} +impl ::prost::Name for StakeAuthorization { + const NAME: &'static str = "StakeAuthorization"; + const PACKAGE: &'static str = "cosmos.staking.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmos.staking.v1beta1.{}", Self::NAME) + } +} +/// AuthorizationType defines the type of staking module authorization type +/// +/// Since: cosmos-sdk 0.43 +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum AuthorizationType { + /// AUTHORIZATION_TYPE_UNSPECIFIED specifies an unknown authorization type + Unspecified = 0, + /// AUTHORIZATION_TYPE_DELEGATE defines an authorization type for Msg/Delegate + Delegate = 1, + /// AUTHORIZATION_TYPE_UNDELEGATE defines an authorization type for Msg/Undelegate + Undelegate = 2, + /// AUTHORIZATION_TYPE_REDELEGATE defines an authorization type for Msg/BeginRedelegate + Redelegate = 3, + /// AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION defines an authorization type for Msg/MsgCancelUnbondingDelegation + CancelUnbondingDelegation = 4, +} +impl AuthorizationType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + AuthorizationType::Unspecified => "AUTHORIZATION_TYPE_UNSPECIFIED", + AuthorizationType::Delegate => "AUTHORIZATION_TYPE_DELEGATE", + AuthorizationType::Undelegate => "AUTHORIZATION_TYPE_UNDELEGATE", + AuthorizationType::Redelegate => "AUTHORIZATION_TYPE_REDELEGATE", + AuthorizationType::CancelUnbondingDelegation => { + "AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION" + } + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "AUTHORIZATION_TYPE_UNSPECIFIED" => Some(Self::Unspecified), + "AUTHORIZATION_TYPE_DELEGATE" => Some(Self::Delegate), + "AUTHORIZATION_TYPE_UNDELEGATE" => Some(Self::Undelegate), + "AUTHORIZATION_TYPE_REDELEGATE" => Some(Self::Redelegate), + "AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION" => { + Some(Self::CancelUnbondingDelegation) + } + _ => None, + } + } +} /// HistoricalInfo contains header and validator information for a given block. /// It is stored as part of staking module's state, which persists the `n` most /// recent HistoricalInfo @@ -1090,106 +1190,6 @@ impl ::prost::Name for QueryParamsResponse { ::prost::alloc::format!("cosmos.staking.v1beta1.{}", Self::NAME) } } -/// StakeAuthorization defines authorization for delegate/undelegate/redelegate. -/// -/// Since: cosmos-sdk 0.43 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct StakeAuthorization { - /// max_tokens specifies the maximum amount of tokens can be delegate to a validator. If it is - /// empty, there is no spend limit and any amount of coins can be delegated. - #[prost(message, optional, tag = "1")] - pub max_tokens: ::core::option::Option, - /// authorization_type defines one of AuthorizationType. - #[prost(enumeration = "AuthorizationType", tag = "4")] - pub authorization_type: i32, - /// validators is the oneof that represents either allow_list or deny_list - #[prost(oneof = "stake_authorization::Validators", tags = "2, 3")] - pub validators: ::core::option::Option, -} -/// Nested message and enum types in `StakeAuthorization`. -pub mod stake_authorization { - /// Validators defines list of validator addresses. - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct ValidatorsVec { - #[prost(string, repeated, tag = "1")] - pub address: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - } - impl ::prost::Name for ValidatorsVec { - const NAME: &'static str = "Validators"; - const PACKAGE: &'static str = "cosmos.staking.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.staking.v1beta1.StakeAuthorization.{}", Self::NAME) - } - } - /// validators is the oneof that represents either allow_list or deny_list - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Validators { - /// allow_list specifies list of validator addresses to whom grantee can delegate tokens on behalf of granter's - /// account. - #[prost(message, tag = "2")] - AllowList(ValidatorsVec), - /// deny_list specifies list of validator addresses to whom grantee can not delegate tokens. - #[prost(message, tag = "3")] - DenyList(ValidatorsVec), - } -} -impl ::prost::Name for StakeAuthorization { - const NAME: &'static str = "StakeAuthorization"; - const PACKAGE: &'static str = "cosmos.staking.v1beta1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmos.staking.v1beta1.{}", Self::NAME) - } -} -/// AuthorizationType defines the type of staking module authorization type -/// -/// Since: cosmos-sdk 0.43 -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum AuthorizationType { - /// AUTHORIZATION_TYPE_UNSPECIFIED specifies an unknown authorization type - Unspecified = 0, - /// AUTHORIZATION_TYPE_DELEGATE defines an authorization type for Msg/Delegate - Delegate = 1, - /// AUTHORIZATION_TYPE_UNDELEGATE defines an authorization type for Msg/Undelegate - Undelegate = 2, - /// AUTHORIZATION_TYPE_REDELEGATE defines an authorization type for Msg/BeginRedelegate - Redelegate = 3, - /// AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION defines an authorization type for Msg/MsgCancelUnbondingDelegation - CancelUnbondingDelegation = 4, -} -impl AuthorizationType { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - AuthorizationType::Unspecified => "AUTHORIZATION_TYPE_UNSPECIFIED", - AuthorizationType::Delegate => "AUTHORIZATION_TYPE_DELEGATE", - AuthorizationType::Undelegate => "AUTHORIZATION_TYPE_UNDELEGATE", - AuthorizationType::Redelegate => "AUTHORIZATION_TYPE_REDELEGATE", - AuthorizationType::CancelUnbondingDelegation => { - "AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION" - } - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "AUTHORIZATION_TYPE_UNSPECIFIED" => Some(Self::Unspecified), - "AUTHORIZATION_TYPE_DELEGATE" => Some(Self::Delegate), - "AUTHORIZATION_TYPE_UNDELEGATE" => Some(Self::Undelegate), - "AUTHORIZATION_TYPE_REDELEGATE" => Some(Self::Redelegate), - "AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION" => { - Some(Self::CancelUnbondingDelegation) - } - _ => None, - } - } -} /// MsgCreateValidator defines a SDK message for creating a new validator. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/generated/rust/protos/src/cosmwasm.wasm.v1.rs b/generated/rust/protos/src/cosmwasm.wasm.v1.rs index 07a89b025b..ede08dfb26 100644 --- a/generated/rust/protos/src/cosmwasm.wasm.v1.rs +++ b/generated/rust/protos/src/cosmwasm.wasm.v1.rs @@ -239,6 +239,199 @@ impl ContractCodeHistoryOperationType { } } } +/// StoreCodeAuthorization defines authorization for wasm code upload. +/// Since: wasmd 0.42 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StoreCodeAuthorization { + /// Grants for code upload + #[prost(message, repeated, tag = "1")] + pub grants: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for StoreCodeAuthorization { + const NAME: &'static str = "StoreCodeAuthorization"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// ContractExecutionAuthorization defines authorization for wasm execute. +/// Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ContractExecutionAuthorization { + /// Grants for contract executions + #[prost(message, repeated, tag = "1")] + pub grants: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ContractExecutionAuthorization { + const NAME: &'static str = "ContractExecutionAuthorization"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// ContractMigrationAuthorization defines authorization for wasm contract +/// migration. Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ContractMigrationAuthorization { + /// Grants for contract migrations + #[prost(message, repeated, tag = "1")] + pub grants: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ContractMigrationAuthorization { + const NAME: &'static str = "ContractMigrationAuthorization"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// CodeGrant a granted permission for a single code +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CodeGrant { + /// CodeHash is the unique identifier created by wasmvm + /// Wildcard "*" is used to specify any kind of grant. + #[prost(bytes = "vec", tag = "1")] + pub code_hash: ::prost::alloc::vec::Vec, + /// InstantiatePermission is the superset access control to apply + /// on contract creation. + /// Optional + #[prost(message, optional, tag = "2")] + pub instantiate_permission: ::core::option::Option, +} +impl ::prost::Name for CodeGrant { + const NAME: &'static str = "CodeGrant"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// ContractGrant a granted permission for a single contract +/// Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ContractGrant { + /// Contract is the bech32 address of the smart contract + #[prost(string, tag = "1")] + pub contract: ::prost::alloc::string::String, + /// Limit defines execution limits that are enforced and updated when the grant + /// is applied. When the limit lapsed the grant is removed. + #[prost(message, optional, tag = "2")] + pub limit: ::core::option::Option, + /// Filter define more fine-grained control on the message payload passed + /// to the contract in the operation. When no filter applies on execution, the + /// operation is prohibited. + #[prost(message, optional, tag = "3")] + pub filter: ::core::option::Option, +} +impl ::prost::Name for ContractGrant { + const NAME: &'static str = "ContractGrant"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// MaxCallsLimit limited number of calls to the contract. No funds transferable. +/// Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MaxCallsLimit { + /// Remaining number that is decremented on each execution + #[prost(uint64, tag = "1")] + pub remaining: u64, +} +impl ::prost::Name for MaxCallsLimit { + const NAME: &'static str = "MaxCallsLimit"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// MaxFundsLimit defines the maximal amounts that can be sent to the contract. +/// Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MaxFundsLimit { + /// Amounts is the maximal amount of tokens transferable to the contract. + #[prost(message, repeated, tag = "1")] + pub amounts: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for MaxFundsLimit { + const NAME: &'static str = "MaxFundsLimit"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// CombinedLimit defines the maximal amounts that can be sent to a contract and +/// the maximal number of calls executable. Both need to remain >0 to be valid. +/// Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CombinedLimit { + /// Remaining number that is decremented on each execution + #[prost(uint64, tag = "1")] + pub calls_remaining: u64, + /// Amounts is the maximal amount of tokens transferable to the contract. + #[prost(message, repeated, tag = "2")] + pub amounts: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for CombinedLimit { + const NAME: &'static str = "CombinedLimit"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// AllowAllMessagesFilter is a wildcard to allow any type of contract payload +/// message. +/// Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AllowAllMessagesFilter {} +impl ::prost::Name for AllowAllMessagesFilter { + const NAME: &'static str = "AllowAllMessagesFilter"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// AcceptedMessageKeysFilter accept only the specific contract message keys in +/// the json object to be executed. +/// Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AcceptedMessageKeysFilter { + /// Messages is the list of unique keys + #[prost(string, repeated, tag = "1")] + pub keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +impl ::prost::Name for AcceptedMessageKeysFilter { + const NAME: &'static str = "AcceptedMessageKeysFilter"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} +/// AcceptedMessagesFilter accept only the specific raw contract messages to be +/// executed. +/// Since: wasmd 0.30 +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AcceptedMessagesFilter { + /// Messages is the list of raw contract messages + #[prost(bytes = "vec", repeated, tag = "1")] + pub messages: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, +} +impl ::prost::Name for AcceptedMessagesFilter { + const NAME: &'static str = "AcceptedMessagesFilter"; + const PACKAGE: &'static str = "cosmwasm.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) + } +} /// GenesisState - genesis state of x/wasm #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -1201,199 +1394,6 @@ impl ::prost::Name for QueryContractsByCreatorResponse { ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) } } -/// StoreCodeAuthorization defines authorization for wasm code upload. -/// Since: wasmd 0.42 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct StoreCodeAuthorization { - /// Grants for code upload - #[prost(message, repeated, tag = "1")] - pub grants: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for StoreCodeAuthorization { - const NAME: &'static str = "StoreCodeAuthorization"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// ContractExecutionAuthorization defines authorization for wasm execute. -/// Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ContractExecutionAuthorization { - /// Grants for contract executions - #[prost(message, repeated, tag = "1")] - pub grants: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for ContractExecutionAuthorization { - const NAME: &'static str = "ContractExecutionAuthorization"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// ContractMigrationAuthorization defines authorization for wasm contract -/// migration. Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ContractMigrationAuthorization { - /// Grants for contract migrations - #[prost(message, repeated, tag = "1")] - pub grants: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for ContractMigrationAuthorization { - const NAME: &'static str = "ContractMigrationAuthorization"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// CodeGrant a granted permission for a single code -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct CodeGrant { - /// CodeHash is the unique identifier created by wasmvm - /// Wildcard "*" is used to specify any kind of grant. - #[prost(bytes = "vec", tag = "1")] - pub code_hash: ::prost::alloc::vec::Vec, - /// InstantiatePermission is the superset access control to apply - /// on contract creation. - /// Optional - #[prost(message, optional, tag = "2")] - pub instantiate_permission: ::core::option::Option, -} -impl ::prost::Name for CodeGrant { - const NAME: &'static str = "CodeGrant"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// ContractGrant a granted permission for a single contract -/// Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ContractGrant { - /// Contract is the bech32 address of the smart contract - #[prost(string, tag = "1")] - pub contract: ::prost::alloc::string::String, - /// Limit defines execution limits that are enforced and updated when the grant - /// is applied. When the limit lapsed the grant is removed. - #[prost(message, optional, tag = "2")] - pub limit: ::core::option::Option, - /// Filter define more fine-grained control on the message payload passed - /// to the contract in the operation. When no filter applies on execution, the - /// operation is prohibited. - #[prost(message, optional, tag = "3")] - pub filter: ::core::option::Option, -} -impl ::prost::Name for ContractGrant { - const NAME: &'static str = "ContractGrant"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// MaxCallsLimit limited number of calls to the contract. No funds transferable. -/// Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MaxCallsLimit { - /// Remaining number that is decremented on each execution - #[prost(uint64, tag = "1")] - pub remaining: u64, -} -impl ::prost::Name for MaxCallsLimit { - const NAME: &'static str = "MaxCallsLimit"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// MaxFundsLimit defines the maximal amounts that can be sent to the contract. -/// Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MaxFundsLimit { - /// Amounts is the maximal amount of tokens transferable to the contract. - #[prost(message, repeated, tag = "1")] - pub amounts: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for MaxFundsLimit { - const NAME: &'static str = "MaxFundsLimit"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// CombinedLimit defines the maximal amounts that can be sent to a contract and -/// the maximal number of calls executable. Both need to remain >0 to be valid. -/// Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct CombinedLimit { - /// Remaining number that is decremented on each execution - #[prost(uint64, tag = "1")] - pub calls_remaining: u64, - /// Amounts is the maximal amount of tokens transferable to the contract. - #[prost(message, repeated, tag = "2")] - pub amounts: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for CombinedLimit { - const NAME: &'static str = "CombinedLimit"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// AllowAllMessagesFilter is a wildcard to allow any type of contract payload -/// message. -/// Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct AllowAllMessagesFilter {} -impl ::prost::Name for AllowAllMessagesFilter { - const NAME: &'static str = "AllowAllMessagesFilter"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// AcceptedMessageKeysFilter accept only the specific contract message keys in -/// the json object to be executed. -/// Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct AcceptedMessageKeysFilter { - /// Messages is the list of unique keys - #[prost(string, repeated, tag = "1")] - pub keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -impl ::prost::Name for AcceptedMessageKeysFilter { - const NAME: &'static str = "AcceptedMessageKeysFilter"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} -/// AcceptedMessagesFilter accept only the specific raw contract messages to be -/// executed. -/// Since: wasmd 0.30 -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct AcceptedMessagesFilter { - /// Messages is the list of raw contract messages - #[prost(bytes = "vec", repeated, tag = "1")] - pub messages: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, -} -impl ::prost::Name for AcceptedMessagesFilter { - const NAME: &'static str = "AcceptedMessagesFilter"; - const PACKAGE: &'static str = "cosmwasm.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("cosmwasm.wasm.v1.{}", Self::NAME) - } -} /// MsgStoreCode submit Wasm code to the system #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/generated/rust/protos/src/google.protobuf.rs b/generated/rust/protos/src/google.protobuf.rs index 20ddcf07f8..99bfd55654 100644 --- a/generated/rust/protos/src/google.protobuf.rs +++ b/generated/rust/protos/src/google.protobuf.rs @@ -2113,176 +2113,255 @@ impl ::prost::Name for Mixin { ::prost::alloc::format!("google.protobuf.{}", Self::NAME) } } -/// Wrapper message for `double`. +/// A generic empty message that you can re-use to avoid defining duplicated +/// empty messages in your APIs. A typical example is to use it as the request +/// or the response type of an API method. For instance: /// -/// The JSON representation for `DoubleValue` is JSON number. +/// service Foo { +/// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +/// } +/// +/// The JSON representation for `Empty` is empty JSON object `{}`. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct DoubleValue { - /// The double value. - #[prost(double, tag = "1")] - pub value: f64, -} -impl ::prost::Name for DoubleValue { - const NAME: &'static str = "DoubleValue"; +pub struct Empty {} +impl ::prost::Name for Empty { + const NAME: &'static str = "Empty"; const PACKAGE: &'static str = "google.protobuf"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!("google.protobuf.{}", Self::NAME) } } -/// Wrapper message for `float`. +/// `FieldMask` represents a set of symbolic field paths, for example: /// -/// The JSON representation for `FloatValue` is JSON number. +/// paths: "f.a" +/// paths: "f.b.d" +/// +/// Here `f` represents a field in some root message, `a` and `b` +/// fields in the message found in `f`, and `d` a field found in the +/// message in `f.b`. +/// +/// Field masks are used to specify a subset of fields that should be +/// returned by a get operation or modified by an update operation. +/// Field masks also have a custom JSON encoding (see below). +/// +/// # Field Masks in Projections +/// +/// When used in the context of a projection, a response message or +/// sub-message is filtered by the API to only contain those fields as +/// specified in the mask. For example, if the mask in the previous +/// example is applied to a response message as follows: +/// +/// f { +/// a : 22 +/// b { +/// d : 1 +/// x : 2 +/// } +/// y : 13 +/// } +/// z: 8 +/// +/// The result will not contain specific values for fields x,y and z +/// (their value will be set to the default, and omitted in proto text +/// output): +/// +/// +/// f { +/// a : 22 +/// b { +/// d : 1 +/// } +/// } +/// +/// A repeated field is not allowed except at the last position of a +/// paths string. +/// +/// If a FieldMask object is not present in a get operation, the +/// operation applies to all fields (as if a FieldMask of all fields +/// had been specified). +/// +/// Note that a field mask does not necessarily apply to the +/// top-level response message. In case of a REST get operation, the +/// field mask applies directly to the response, but in case of a REST +/// list operation, the mask instead applies to each individual message +/// in the returned resource list. In case of a REST custom method, +/// other definitions may be used. Where the mask applies will be +/// clearly documented together with its declaration in the API. In +/// any case, the effect on the returned resource/resources is required +/// behavior for APIs. +/// +/// # Field Masks in Update Operations +/// +/// A field mask in update operations specifies which fields of the +/// targeted resource are going to be updated. The API is required +/// to only change the values of the fields as specified in the mask +/// and leave the others untouched. If a resource is passed in to +/// describe the updated values, the API ignores the values of all +/// fields not covered by the mask. +/// +/// If a repeated field is specified for an update operation, new values will +/// be appended to the existing repeated field in the target resource. Note that +/// a repeated field is only allowed in the last position of a `paths` string. +/// +/// If a sub-message is specified in the last position of the field mask for an +/// update operation, then new value will be merged into the existing sub-message +/// in the target resource. +/// +/// For example, given the target message: +/// +/// f { +/// b { +/// d: 1 +/// x: 2 +/// } +/// c: \[1\] +/// } +/// +/// And an update message: +/// +/// f { +/// b { +/// d: 10 +/// } +/// c: \[2\] +/// } +/// +/// then if the field mask is: +/// +/// paths: \["f.b", "f.c"\] +/// +/// then the result will be: +/// +/// f { +/// b { +/// d: 10 +/// x: 2 +/// } +/// c: \[1, 2\] +/// } +/// +/// An implementation may provide options to override this default behavior for +/// repeated and message fields. +/// +/// In order to reset a field's value to the default, the field must +/// be in the mask and set to the default value in the provided resource. +/// Hence, in order to reset all fields of a resource, provide a default +/// instance of the resource and set all fields in the mask, or do +/// not provide a mask as described below. +/// +/// If a field mask is not present on update, the operation applies to +/// all fields (as if a field mask of all fields has been specified). +/// Note that in the presence of schema evolution, this may mean that +/// fields the client does not know and has therefore not filled into +/// the request will be reset to their default. If this is unwanted +/// behavior, a specific service may require a client to always specify +/// a field mask, producing an error if not. +/// +/// As with get operations, the location of the resource which +/// describes the updated values in the request message depends on the +/// operation kind. In any case, the effect of the field mask is +/// required to be honored by the API. +/// +/// ## Considerations for HTTP REST +/// +/// The HTTP kind of an update operation which uses a field mask must +/// be set to PATCH instead of PUT in order to satisfy HTTP semantics +/// (PUT must only be used for full updates). +/// +/// # JSON Encoding of Field Masks +/// +/// In JSON, a field mask is encoded as a single string where paths are +/// separated by a comma. Fields name in each path are converted +/// to/from lower-camel naming conventions. +/// +/// As an example, consider the following message declarations: +/// +/// message Profile { +/// User user = 1; +/// Photo photo = 2; +/// } +/// message User { +/// string display_name = 1; +/// string address = 2; +/// } +/// +/// In proto a field mask for `Profile` may look as such: +/// +/// mask { +/// paths: "user.display_name" +/// paths: "photo" +/// } +/// +/// In JSON, the same mask is represented as below: +/// +/// { +/// mask: "user.displayName,photo" +/// } +/// +/// # Field Masks and Oneof Fields +/// +/// Field masks treat fields in oneofs just as regular fields. Consider the +/// following message: +/// +/// message SampleMessage { +/// oneof test_oneof { +/// string name = 4; +/// SubMessage sub_message = 9; +/// } +/// } +/// +/// The field mask can be: +/// +/// mask { +/// paths: "name" +/// } +/// +/// Or: +/// +/// mask { +/// paths: "sub_message" +/// } +/// +/// Note that oneof type names ("test_oneof" in this case) cannot be used in +/// paths. +/// +/// ## Field Mask Verification +/// +/// The implementation of any API method which has a FieldMask type field in the +/// request should verify the included field paths, and return an +/// `INVALID_ARGUMENT` error if any path is unmappable. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct FloatValue { - /// The float value. - #[prost(float, tag = "1")] - pub value: f32, +pub struct FieldMask { + /// The set of field mask paths. + #[prost(string, repeated, tag = "1")] + pub paths: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -impl ::prost::Name for FloatValue { - const NAME: &'static str = "FloatValue"; +impl ::prost::Name for FieldMask { + const NAME: &'static str = "FieldMask"; const PACKAGE: &'static str = "google.protobuf"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!("google.protobuf.{}", Self::NAME) } } -/// Wrapper message for `int64`. +/// `Struct` represents a structured data value, consisting of fields +/// which map to dynamically typed values. In some languages, `Struct` +/// might be supported by a native representation. For example, in +/// scripting languages like JS a struct is represented as an +/// object. The details of that representation are described together +/// with the proto support for the language. /// -/// The JSON representation for `Int64Value` is JSON string. +/// The JSON representation for `Struct` is JSON object. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct Int64Value { - /// The int64 value. - #[prost(int64, tag = "1")] - pub value: i64, +pub struct Struct { + /// Unordered map of dynamically typed values. + #[prost(map = "string, message", tag = "1")] + pub fields: ::std::collections::HashMap<::prost::alloc::string::String, Value>, } -impl ::prost::Name for Int64Value { - const NAME: &'static str = "Int64Value"; - const PACKAGE: &'static str = "google.protobuf"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("google.protobuf.{}", Self::NAME) - } -} -/// Wrapper message for `uint64`. -/// -/// The JSON representation for `UInt64Value` is JSON string. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct UInt64Value { - /// The uint64 value. - #[prost(uint64, tag = "1")] - pub value: u64, -} -impl ::prost::Name for UInt64Value { - const NAME: &'static str = "UInt64Value"; - const PACKAGE: &'static str = "google.protobuf"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("google.protobuf.{}", Self::NAME) - } -} -/// Wrapper message for `int32`. -/// -/// The JSON representation for `Int32Value` is JSON number. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Int32Value { - /// The int32 value. - #[prost(int32, tag = "1")] - pub value: i32, -} -impl ::prost::Name for Int32Value { - const NAME: &'static str = "Int32Value"; - const PACKAGE: &'static str = "google.protobuf"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("google.protobuf.{}", Self::NAME) - } -} -/// Wrapper message for `uint32`. -/// -/// The JSON representation for `UInt32Value` is JSON number. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct UInt32Value { - /// The uint32 value. - #[prost(uint32, tag = "1")] - pub value: u32, -} -impl ::prost::Name for UInt32Value { - const NAME: &'static str = "UInt32Value"; - const PACKAGE: &'static str = "google.protobuf"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("google.protobuf.{}", Self::NAME) - } -} -/// Wrapper message for `bool`. -/// -/// The JSON representation for `BoolValue` is JSON `true` and `false`. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct BoolValue { - /// The bool value. - #[prost(bool, tag = "1")] - pub value: bool, -} -impl ::prost::Name for BoolValue { - const NAME: &'static str = "BoolValue"; - const PACKAGE: &'static str = "google.protobuf"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("google.protobuf.{}", Self::NAME) - } -} -/// Wrapper message for `string`. -/// -/// The JSON representation for `StringValue` is JSON string. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct StringValue { - /// The string value. - #[prost(string, tag = "1")] - pub value: ::prost::alloc::string::String, -} -impl ::prost::Name for StringValue { - const NAME: &'static str = "StringValue"; - const PACKAGE: &'static str = "google.protobuf"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("google.protobuf.{}", Self::NAME) - } -} -/// Wrapper message for `bytes`. -/// -/// The JSON representation for `BytesValue` is JSON string. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct BytesValue { - /// The bytes value. - #[prost(bytes = "vec", tag = "1")] - pub value: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for BytesValue { - const NAME: &'static str = "BytesValue"; - const PACKAGE: &'static str = "google.protobuf"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("google.protobuf.{}", Self::NAME) - } -} -/// `Struct` represents a structured data value, consisting of fields -/// which map to dynamically typed values. In some languages, `Struct` -/// might be supported by a native representation. For example, in -/// scripting languages like JS a struct is represented as an -/// object. The details of that representation are described together -/// with the proto support for the language. -/// -/// The JSON representation for `Struct` is JSON object. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Struct { - /// Unordered map of dynamically typed values. - #[prost(map = "string, message", tag = "1")] - pub fields: ::std::collections::HashMap<::prost::alloc::string::String, Value>, -} -impl ::prost::Name for Struct { - const NAME: &'static str = "Struct"; +impl ::prost::Name for Struct { + const NAME: &'static str = "Struct"; const PACKAGE: &'static str = "google.protobuf"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!("google.protobuf.{}", Self::NAME) @@ -2379,233 +2458,154 @@ impl NullValue { } } } -/// `FieldMask` represents a set of symbolic field paths, for example: -/// -/// paths: "f.a" -/// paths: "f.b.d" -/// -/// Here `f` represents a field in some root message, `a` and `b` -/// fields in the message found in `f`, and `d` a field found in the -/// message in `f.b`. -/// -/// Field masks are used to specify a subset of fields that should be -/// returned by a get operation or modified by an update operation. -/// Field masks also have a custom JSON encoding (see below). -/// -/// # Field Masks in Projections -/// -/// When used in the context of a projection, a response message or -/// sub-message is filtered by the API to only contain those fields as -/// specified in the mask. For example, if the mask in the previous -/// example is applied to a response message as follows: -/// -/// f { -/// a : 22 -/// b { -/// d : 1 -/// x : 2 -/// } -/// y : 13 -/// } -/// z: 8 -/// -/// The result will not contain specific values for fields x,y and z -/// (their value will be set to the default, and omitted in proto text -/// output): -/// -/// -/// f { -/// a : 22 -/// b { -/// d : 1 -/// } -/// } -/// -/// A repeated field is not allowed except at the last position of a -/// paths string. -/// -/// If a FieldMask object is not present in a get operation, the -/// operation applies to all fields (as if a FieldMask of all fields -/// had been specified). -/// -/// Note that a field mask does not necessarily apply to the -/// top-level response message. In case of a REST get operation, the -/// field mask applies directly to the response, but in case of a REST -/// list operation, the mask instead applies to each individual message -/// in the returned resource list. In case of a REST custom method, -/// other definitions may be used. Where the mask applies will be -/// clearly documented together with its declaration in the API. In -/// any case, the effect on the returned resource/resources is required -/// behavior for APIs. -/// -/// # Field Masks in Update Operations -/// -/// A field mask in update operations specifies which fields of the -/// targeted resource are going to be updated. The API is required -/// to only change the values of the fields as specified in the mask -/// and leave the others untouched. If a resource is passed in to -/// describe the updated values, the API ignores the values of all -/// fields not covered by the mask. -/// -/// If a repeated field is specified for an update operation, new values will -/// be appended to the existing repeated field in the target resource. Note that -/// a repeated field is only allowed in the last position of a `paths` string. -/// -/// If a sub-message is specified in the last position of the field mask for an -/// update operation, then new value will be merged into the existing sub-message -/// in the target resource. -/// -/// For example, given the target message: -/// -/// f { -/// b { -/// d: 1 -/// x: 2 -/// } -/// c: \[1\] -/// } -/// -/// And an update message: -/// -/// f { -/// b { -/// d: 10 -/// } -/// c: \[2\] -/// } -/// -/// then if the field mask is: -/// -/// paths: \["f.b", "f.c"\] -/// -/// then the result will be: -/// -/// f { -/// b { -/// d: 10 -/// x: 2 -/// } -/// c: \[1, 2\] -/// } -/// -/// An implementation may provide options to override this default behavior for -/// repeated and message fields. -/// -/// In order to reset a field's value to the default, the field must -/// be in the mask and set to the default value in the provided resource. -/// Hence, in order to reset all fields of a resource, provide a default -/// instance of the resource and set all fields in the mask, or do -/// not provide a mask as described below. -/// -/// If a field mask is not present on update, the operation applies to -/// all fields (as if a field mask of all fields has been specified). -/// Note that in the presence of schema evolution, this may mean that -/// fields the client does not know and has therefore not filled into -/// the request will be reset to their default. If this is unwanted -/// behavior, a specific service may require a client to always specify -/// a field mask, producing an error if not. -/// -/// As with get operations, the location of the resource which -/// describes the updated values in the request message depends on the -/// operation kind. In any case, the effect of the field mask is -/// required to be honored by the API. -/// -/// ## Considerations for HTTP REST -/// -/// The HTTP kind of an update operation which uses a field mask must -/// be set to PATCH instead of PUT in order to satisfy HTTP semantics -/// (PUT must only be used for full updates). -/// -/// # JSON Encoding of Field Masks -/// -/// In JSON, a field mask is encoded as a single string where paths are -/// separated by a comma. Fields name in each path are converted -/// to/from lower-camel naming conventions. -/// -/// As an example, consider the following message declarations: -/// -/// message Profile { -/// User user = 1; -/// Photo photo = 2; -/// } -/// message User { -/// string display_name = 1; -/// string address = 2; -/// } -/// -/// In proto a field mask for `Profile` may look as such: -/// -/// mask { -/// paths: "user.display_name" -/// paths: "photo" -/// } -/// -/// In JSON, the same mask is represented as below: -/// -/// { -/// mask: "user.displayName,photo" -/// } -/// -/// # Field Masks and Oneof Fields -/// -/// Field masks treat fields in oneofs just as regular fields. Consider the -/// following message: -/// -/// message SampleMessage { -/// oneof test_oneof { -/// string name = 4; -/// SubMessage sub_message = 9; -/// } -/// } +/// Wrapper message for `double`. /// -/// The field mask can be: +/// The JSON representation for `DoubleValue` is JSON number. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DoubleValue { + /// The double value. + #[prost(double, tag = "1")] + pub value: f64, +} +impl ::prost::Name for DoubleValue { + const NAME: &'static str = "DoubleValue"; + const PACKAGE: &'static str = "google.protobuf"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("google.protobuf.{}", Self::NAME) + } +} +/// Wrapper message for `float`. /// -/// mask { -/// paths: "name" -/// } +/// The JSON representation for `FloatValue` is JSON number. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct FloatValue { + /// The float value. + #[prost(float, tag = "1")] + pub value: f32, +} +impl ::prost::Name for FloatValue { + const NAME: &'static str = "FloatValue"; + const PACKAGE: &'static str = "google.protobuf"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("google.protobuf.{}", Self::NAME) + } +} +/// Wrapper message for `int64`. /// -/// Or: +/// The JSON representation for `Int64Value` is JSON string. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Int64Value { + /// The int64 value. + #[prost(int64, tag = "1")] + pub value: i64, +} +impl ::prost::Name for Int64Value { + const NAME: &'static str = "Int64Value"; + const PACKAGE: &'static str = "google.protobuf"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("google.protobuf.{}", Self::NAME) + } +} +/// Wrapper message for `uint64`. /// -/// mask { -/// paths: "sub_message" -/// } +/// The JSON representation for `UInt64Value` is JSON string. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UInt64Value { + /// The uint64 value. + #[prost(uint64, tag = "1")] + pub value: u64, +} +impl ::prost::Name for UInt64Value { + const NAME: &'static str = "UInt64Value"; + const PACKAGE: &'static str = "google.protobuf"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("google.protobuf.{}", Self::NAME) + } +} +/// Wrapper message for `int32`. /// -/// Note that oneof type names ("test_oneof" in this case) cannot be used in -/// paths. +/// The JSON representation for `Int32Value` is JSON number. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Int32Value { + /// The int32 value. + #[prost(int32, tag = "1")] + pub value: i32, +} +impl ::prost::Name for Int32Value { + const NAME: &'static str = "Int32Value"; + const PACKAGE: &'static str = "google.protobuf"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("google.protobuf.{}", Self::NAME) + } +} +/// Wrapper message for `uint32`. /// -/// ## Field Mask Verification +/// The JSON representation for `UInt32Value` is JSON number. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UInt32Value { + /// The uint32 value. + #[prost(uint32, tag = "1")] + pub value: u32, +} +impl ::prost::Name for UInt32Value { + const NAME: &'static str = "UInt32Value"; + const PACKAGE: &'static str = "google.protobuf"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("google.protobuf.{}", Self::NAME) + } +} +/// Wrapper message for `bool`. /// -/// The implementation of any API method which has a FieldMask type field in the -/// request should verify the included field paths, and return an -/// `INVALID_ARGUMENT` error if any path is unmappable. +/// The JSON representation for `BoolValue` is JSON `true` and `false`. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct FieldMask { - /// The set of field mask paths. - #[prost(string, repeated, tag = "1")] - pub paths: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +pub struct BoolValue { + /// The bool value. + #[prost(bool, tag = "1")] + pub value: bool, } -impl ::prost::Name for FieldMask { - const NAME: &'static str = "FieldMask"; +impl ::prost::Name for BoolValue { + const NAME: &'static str = "BoolValue"; const PACKAGE: &'static str = "google.protobuf"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!("google.protobuf.{}", Self::NAME) } } -/// A generic empty message that you can re-use to avoid defining duplicated -/// empty messages in your APIs. A typical example is to use it as the request -/// or the response type of an API method. For instance: +/// Wrapper message for `string`. /// -/// service Foo { -/// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); -/// } +/// The JSON representation for `StringValue` is JSON string. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StringValue { + /// The string value. + #[prost(string, tag = "1")] + pub value: ::prost::alloc::string::String, +} +impl ::prost::Name for StringValue { + const NAME: &'static str = "StringValue"; + const PACKAGE: &'static str = "google.protobuf"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("google.protobuf.{}", Self::NAME) + } +} +/// Wrapper message for `bytes`. /// -/// The JSON representation for `Empty` is empty JSON object `{}`. +/// The JSON representation for `BytesValue` is JSON string. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct Empty {} -impl ::prost::Name for Empty { - const NAME: &'static str = "Empty"; +pub struct BytesValue { + /// The bytes value. + #[prost(bytes = "vec", tag = "1")] + pub value: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for BytesValue { + const NAME: &'static str = "BytesValue"; const PACKAGE: &'static str = "google.protobuf"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!("google.protobuf.{}", Self::NAME) diff --git a/generated/rust/protos/src/ibc.applications.fee.v1.rs b/generated/rust/protos/src/ibc.applications.fee.v1.rs index 83d452f5cf..e0da18ac61 100644 --- a/generated/rust/protos/src/ibc.applications.fee.v1.rs +++ b/generated/rust/protos/src/ibc.applications.fee.v1.rs @@ -1,4 +1,25 @@ // @generated +/// IncentivizedAcknowledgement is the acknowledgement format to be used by applications wrapped in the fee middleware +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct IncentivizedAcknowledgement { + /// the underlying app acknowledgement bytes + #[prost(bytes = "vec", tag = "1")] + pub app_acknowledgement: ::prost::alloc::vec::Vec, + /// the relayer address which submits the recv packet message + #[prost(string, tag = "2")] + pub forward_relayer_address: ::prost::alloc::string::String, + /// success flag of the base application callback + #[prost(bool, tag = "3")] + pub underlying_app_success: bool, +} +impl ::prost::Name for IncentivizedAcknowledgement { + const NAME: &'static str = "IncentivizedAcknowledgement"; + const PACKAGE: &'static str = "ibc.applications.fee.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("ibc.applications.fee.v1.{}", Self::NAME) + } +} /// Fee defines the ICS29 receive, acknowledgement and timeout fees #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -549,27 +570,6 @@ impl ::prost::Name for QueryFeeEnabledChannelResponse { ::prost::alloc::format!("ibc.applications.fee.v1.{}", Self::NAME) } } -/// IncentivizedAcknowledgement is the acknowledgement format to be used by applications wrapped in the fee middleware -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct IncentivizedAcknowledgement { - /// the underlying app acknowledgement bytes - #[prost(bytes = "vec", tag = "1")] - pub app_acknowledgement: ::prost::alloc::vec::Vec, - /// the relayer address which submits the recv packet message - #[prost(string, tag = "2")] - pub forward_relayer_address: ::prost::alloc::string::String, - /// success flag of the base application callback - #[prost(bool, tag = "3")] - pub underlying_app_success: bool, -} -impl ::prost::Name for IncentivizedAcknowledgement { - const NAME: &'static str = "IncentivizedAcknowledgement"; - const PACKAGE: &'static str = "ibc.applications.fee.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("ibc.applications.fee.v1.{}", Self::NAME) - } -} /// MsgRegisterPayee defines the request type for the RegisterPayee rpc #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/generated/rust/protos/src/ibc.applications.interchain_accounts.v1.rs b/generated/rust/protos/src/ibc.applications.interchain_accounts.v1.rs index d3f19e8d88..358010c023 100644 --- a/generated/rust/protos/src/ibc.applications.interchain_accounts.v1.rs +++ b/generated/rust/protos/src/ibc.applications.interchain_accounts.v1.rs @@ -64,6 +64,24 @@ impl Type { } } } +/// An InterchainAccount is defined as a BaseAccount & the address of the account owner on the controller chain +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct InterchainAccount { + #[prost(message, optional, tag = "1")] + pub base_account: + ::core::option::Option, + #[prost(string, tag = "2")] + pub account_owner: ::prost::alloc::string::String, +} +impl ::prost::Name for InterchainAccount { + const NAME: &'static str = "InterchainAccount"; + const PACKAGE: &'static str = "ibc.applications.interchain_accounts.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("ibc.applications.interchain_accounts.v1.{}", Self::NAME) + } +} /// Metadata defines a set of protocol specific data encoded into the ICS27 channel version bytestring /// See ICS004: #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -97,22 +115,4 @@ impl ::prost::Name for Metadata { ::prost::alloc::format!("ibc.applications.interchain_accounts.v1.{}", Self::NAME) } } -/// An InterchainAccount is defined as a BaseAccount & the address of the account owner on the controller chain -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct InterchainAccount { - #[prost(message, optional, tag = "1")] - pub base_account: - ::core::option::Option, - #[prost(string, tag = "2")] - pub account_owner: ::prost::alloc::string::String, -} -impl ::prost::Name for InterchainAccount { - const NAME: &'static str = "InterchainAccount"; - const PACKAGE: &'static str = "ibc.applications.interchain_accounts.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("ibc.applications.interchain_accounts.v1.{}", Self::NAME) - } -} // @@protoc_insertion_point(module) diff --git a/generated/rust/protos/src/ibc.applications.transfer.v1.rs b/generated/rust/protos/src/ibc.applications.transfer.v1.rs index 0812763ad8..d8349d9c62 100644 --- a/generated/rust/protos/src/ibc.applications.transfer.v1.rs +++ b/generated/rust/protos/src/ibc.applications.transfer.v1.rs @@ -1,4 +1,47 @@ // @generated +/// Allocation defines the spend limit for a particular port and channel +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Allocation { + /// the port on which the packet will be sent + #[prost(string, tag = "1")] + pub source_port: ::prost::alloc::string::String, + /// the channel by which the packet will be sent + #[prost(string, tag = "2")] + pub source_channel: ::prost::alloc::string::String, + /// spend limitation on the channel + #[prost(message, repeated, tag = "3")] + pub spend_limit: + ::prost::alloc::vec::Vec, + /// allow list of receivers, an empty allow list permits any receiver address + #[prost(string, repeated, tag = "4")] + pub allow_list: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +impl ::prost::Name for Allocation { + const NAME: &'static str = "Allocation"; + const PACKAGE: &'static str = "ibc.applications.transfer.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("ibc.applications.transfer.v1.{}", Self::NAME) + } +} +/// TransferAuthorization allows the grantee to spend up to spend_limit coins from +/// the granter's account for ibc transfer on a specific channel +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct TransferAuthorization { + /// port and channel amounts + #[prost(message, repeated, tag = "1")] + pub allocations: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for TransferAuthorization { + const NAME: &'static str = "TransferAuthorization"; + const PACKAGE: &'static str = "ibc.applications.transfer.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("ibc.applications.transfer.v1.{}", Self::NAME) + } +} /// DenomTrace contains the base denomination for ICS20 fungible tokens and the /// source tracing information path. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -270,49 +313,6 @@ impl ::prost::Name for QueryTotalEscrowForDenomResponse { ::prost::alloc::format!("ibc.applications.transfer.v1.{}", Self::NAME) } } -/// Allocation defines the spend limit for a particular port and channel -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Allocation { - /// the port on which the packet will be sent - #[prost(string, tag = "1")] - pub source_port: ::prost::alloc::string::String, - /// the channel by which the packet will be sent - #[prost(string, tag = "2")] - pub source_channel: ::prost::alloc::string::String, - /// spend limitation on the channel - #[prost(message, repeated, tag = "3")] - pub spend_limit: - ::prost::alloc::vec::Vec, - /// allow list of receivers, an empty allow list permits any receiver address - #[prost(string, repeated, tag = "4")] - pub allow_list: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -impl ::prost::Name for Allocation { - const NAME: &'static str = "Allocation"; - const PACKAGE: &'static str = "ibc.applications.transfer.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("ibc.applications.transfer.v1.{}", Self::NAME) - } -} -/// TransferAuthorization allows the grantee to spend up to spend_limit coins from -/// the granter's account for ibc transfer on a specific channel -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct TransferAuthorization { - /// port and channel amounts - #[prost(message, repeated, tag = "1")] - pub allocations: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for TransferAuthorization { - const NAME: &'static str = "TransferAuthorization"; - const PACKAGE: &'static str = "ibc.applications.transfer.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("ibc.applications.transfer.v1.{}", Self::NAME) - } -} /// MsgTransfer defines a msg to transfer fungible tokens (i.e Coins) between /// ICS20 enabled chains. See ICS Spec here: /// diff --git a/generated/rust/protos/src/ibc.lightclients.wasm.v1.rs b/generated/rust/protos/src/ibc.lightclients.wasm.v1.rs index 56b73c7df8..b0f1357df4 100644 --- a/generated/rust/protos/src/ibc.lightclients.wasm.v1.rs +++ b/generated/rust/protos/src/ibc.lightclients.wasm.v1.rs @@ -101,62 +101,6 @@ impl ::prost::Name for QueryCodeResponse { ::prost::alloc::format!("ibc.lightclients.wasm.v1.{}", Self::NAME) } } -/// Wasm light client's Client state -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ClientState { - /// bytes encoding the client state of the underlying light client - /// implemented as a Wasm contract. - #[prost(bytes = "vec", tag = "1")] - #[cfg_attr(feature = "serde", serde(with = "::serde_utils::base64"))] - pub data: ::prost::alloc::vec::Vec, - #[prost(bytes = "vec", tag = "2")] - #[cfg_attr(feature = "serde", serde(with = "::serde_utils::base64"))] - pub checksum: ::prost::alloc::vec::Vec, - #[prost(message, optional, tag = "3")] - pub latest_height: ::core::option::Option, -} -impl ::prost::Name for ClientState { - const NAME: &'static str = "ClientState"; - const PACKAGE: &'static str = "ibc.lightclients.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("ibc.lightclients.wasm.v1.{}", Self::NAME) - } -} -/// Wasm light client's ConsensusState -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsensusState { - /// bytes encoding the consensus state of the underlying light client - /// implemented as a Wasm contract. - #[prost(bytes = "vec", tag = "1")] - #[cfg_attr(feature = "serde", serde(with = "::serde_utils::base64"))] - pub data: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for ConsensusState { - const NAME: &'static str = "ConsensusState"; - const PACKAGE: &'static str = "ibc.lightclients.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("ibc.lightclients.wasm.v1.{}", Self::NAME) - } -} -/// Wasm light client message (either header(s) or misbehaviour) -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ClientMessage { - #[prost(bytes = "vec", tag = "1")] - pub data: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for ClientMessage { - const NAME: &'static str = "ClientMessage"; - const PACKAGE: &'static str = "ibc.lightclients.wasm.v1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("ibc.lightclients.wasm.v1.{}", Self::NAME) - } -} /// MsgStoreCode defines the request type for the StoreCode rpc. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] @@ -260,5 +204,61 @@ impl ::prost::Name for MsgMigrateContractResponse { ::prost::alloc::format!("ibc.lightclients.wasm.v1.{}", Self::NAME) } } +/// Wasm light client's Client state +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ClientState { + /// bytes encoding the client state of the underlying light client + /// implemented as a Wasm contract. + #[prost(bytes = "vec", tag = "1")] + #[cfg_attr(feature = "serde", serde(with = "::serde_utils::base64"))] + pub data: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "2")] + #[cfg_attr(feature = "serde", serde(with = "::serde_utils::base64"))] + pub checksum: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "3")] + pub latest_height: ::core::option::Option, +} +impl ::prost::Name for ClientState { + const NAME: &'static str = "ClientState"; + const PACKAGE: &'static str = "ibc.lightclients.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("ibc.lightclients.wasm.v1.{}", Self::NAME) + } +} +/// Wasm light client's ConsensusState +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsensusState { + /// bytes encoding the consensus state of the underlying light client + /// implemented as a Wasm contract. + #[prost(bytes = "vec", tag = "1")] + #[cfg_attr(feature = "serde", serde(with = "::serde_utils::base64"))] + pub data: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ConsensusState { + const NAME: &'static str = "ConsensusState"; + const PACKAGE: &'static str = "ibc.lightclients.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("ibc.lightclients.wasm.v1.{}", Self::NAME) + } +} +/// Wasm light client message (either header(s) or misbehaviour) +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ClientMessage { + #[prost(bytes = "vec", tag = "1")] + pub data: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ClientMessage { + const NAME: &'static str = "ClientMessage"; + const PACKAGE: &'static str = "ibc.lightclients.wasm.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("ibc.lightclients.wasm.v1.{}", Self::NAME) + } +} include!("ibc.lightclients.wasm.v1.tonic.rs"); // @@protoc_insertion_point(module) diff --git a/generated/rust/protos/src/lib.rs b/generated/rust/protos/src/lib.rs index 671720d311..820ef69e53 100644 --- a/generated/rust/protos/src/lib.rs +++ b/generated/rust/protos/src/lib.rs @@ -869,6 +869,14 @@ pub mod union { } } } + pub mod ics23 { + #[cfg(feature = "union+ics23+v1")] + // @@protoc_insertion_point(attribute:union.ics23.v1) + pub mod v1 { + include!("union.ics23.v1.rs"); + // @@protoc_insertion_point(union.ics23.v1) + } + } pub mod staking { #[cfg(feature = "union+staking+v1")] // @@protoc_insertion_point(attribute:union.staking.v1) diff --git a/generated/rust/protos/src/tendermint.p2p.rs b/generated/rust/protos/src/tendermint.p2p.rs index aa106a9e20..a1d59891e6 100644 --- a/generated/rust/protos/src/tendermint.p2p.rs +++ b/generated/rust/protos/src/tendermint.p2p.rs @@ -1,6 +1,84 @@ // @generated #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct PacketPing {} +impl ::prost::Name for PacketPing { + const NAME: &'static str = "PacketPing"; + const PACKAGE: &'static str = "tendermint.p2p"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PacketPong {} +impl ::prost::Name for PacketPong { + const NAME: &'static str = "PacketPong"; + const PACKAGE: &'static str = "tendermint.p2p"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PacketMsg { + #[prost(int32, tag = "1")] + pub channel_id: i32, + #[prost(bool, tag = "2")] + pub eof: bool, + #[prost(bytes = "vec", tag = "3")] + pub data: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for PacketMsg { + const NAME: &'static str = "PacketMsg"; + const PACKAGE: &'static str = "tendermint.p2p"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Packet { + #[prost(oneof = "packet::Sum", tags = "1, 2, 3")] + pub sum: ::core::option::Option, +} +/// Nested message and enum types in `Packet`. +pub mod packet { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Sum { + #[prost(message, tag = "1")] + PacketPing(super::PacketPing), + #[prost(message, tag = "2")] + PacketPong(super::PacketPong), + #[prost(message, tag = "3")] + PacketMsg(super::PacketMsg), + } +} +impl ::prost::Name for Packet { + const NAME: &'static str = "Packet"; + const PACKAGE: &'static str = "tendermint.p2p"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AuthSigMessage { + #[prost(message, optional, tag = "1")] + pub pub_key: ::core::option::Option, + #[prost(bytes = "vec", tag = "2")] + pub sig: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for AuthSigMessage { + const NAME: &'static str = "AuthSigMessage"; + const PACKAGE: &'static str = "tendermint.p2p"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct NetAddress { #[prost(string, tag = "1")] pub id: ::prost::alloc::string::String, @@ -122,82 +200,4 @@ impl ::prost::Name for Message { ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) } } -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct PacketPing {} -impl ::prost::Name for PacketPing { - const NAME: &'static str = "PacketPing"; - const PACKAGE: &'static str = "tendermint.p2p"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct PacketPong {} -impl ::prost::Name for PacketPong { - const NAME: &'static str = "PacketPong"; - const PACKAGE: &'static str = "tendermint.p2p"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct PacketMsg { - #[prost(int32, tag = "1")] - pub channel_id: i32, - #[prost(bool, tag = "2")] - pub eof: bool, - #[prost(bytes = "vec", tag = "3")] - pub data: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for PacketMsg { - const NAME: &'static str = "PacketMsg"; - const PACKAGE: &'static str = "tendermint.p2p"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Packet { - #[prost(oneof = "packet::Sum", tags = "1, 2, 3")] - pub sum: ::core::option::Option, -} -/// Nested message and enum types in `Packet`. -pub mod packet { - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Sum { - #[prost(message, tag = "1")] - PacketPing(super::PacketPing), - #[prost(message, tag = "2")] - PacketPong(super::PacketPong), - #[prost(message, tag = "3")] - PacketMsg(super::PacketMsg), - } -} -impl ::prost::Name for Packet { - const NAME: &'static str = "Packet"; - const PACKAGE: &'static str = "tendermint.p2p"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct AuthSigMessage { - #[prost(message, optional, tag = "1")] - pub pub_key: ::core::option::Option, - #[prost(bytes = "vec", tag = "2")] - pub sig: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for AuthSigMessage { - const NAME: &'static str = "AuthSigMessage"; - const PACKAGE: &'static str = "tendermint.p2p"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("tendermint.p2p.{}", Self::NAME) - } -} // @@protoc_insertion_point(module) diff --git a/generated/rust/protos/src/union.ibc.lightclients.cometbls.v1.rs b/generated/rust/protos/src/union.ibc.lightclients.cometbls.v1.rs index 2af4de6c26..6ecbe509b8 100644 --- a/generated/rust/protos/src/union.ibc.lightclients.cometbls.v1.rs +++ b/generated/rust/protos/src/union.ibc.lightclients.cometbls.v1.rs @@ -71,7 +71,6 @@ impl ::prost::Name for Misbehaviour { ::prost::alloc::format!("union.ibc.lightclients.cometbls.v1.{}", Self::NAME) } } -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct LightHeader { diff --git a/generated/rust/protos/src/union.ibc.lightclients.scroll.v1.rs b/generated/rust/protos/src/union.ibc.lightclients.scroll.v1.rs index 356b71b8f5..c6ef18b2f7 100644 --- a/generated/rust/protos/src/union.ibc.lightclients.scroll.v1.rs +++ b/generated/rust/protos/src/union.ibc.lightclients.scroll.v1.rs @@ -1,4 +1,5 @@ // @generated +/// TODO: l2_ instead of rollup_ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ClientState { @@ -8,6 +9,7 @@ pub struct ClientState { pub chain_id: ::prost::alloc::string::String, #[prost(uint64, tag = "3")] pub latest_batch_index: u64, + /// TODO: Should be rollup_ #[prost(bytes = "vec", tag = "4")] pub latest_batch_index_slot: ::prost::alloc::vec::Vec, #[prost(message, optional, tag = "5")] @@ -18,8 +20,10 @@ pub struct ClientState { #[prost(bytes = "vec", tag = "7")] pub rollup_finalized_state_roots_slot: ::prost::alloc::vec::Vec, #[prost(bytes = "vec", tag = "8")] - pub ibc_contract_address: ::prost::alloc::vec::Vec, + pub rollup_committed_batches_slot: ::prost::alloc::vec::Vec, #[prost(bytes = "vec", tag = "9")] + pub ibc_contract_address: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "10")] pub ibc_commitment_slot: ::prost::alloc::vec::Vec, } impl ::prost::Name for ClientState { @@ -63,7 +67,15 @@ pub struct Header { #[prost(message, optional, tag = "6")] pub last_batch_index_proof: ::core::option::Option, #[prost(message, optional, tag = "7")] + pub batch_hash_proof: ::core::option::Option, + #[prost(message, optional, tag = "8")] pub l2_ibc_account_proof: ::core::option::Option, + #[prost(bytes = "vec", tag = "9")] + pub commit_batch_calldata: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "10")] + pub l1_message_hashes: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "11")] + pub blob_versioned_hash: ::prost::alloc::vec::Vec, } impl ::prost::Name for Header { const NAME: &'static str = "Header"; @@ -72,4 +84,19 @@ impl ::prost::Name for Header { ::prost::alloc::format!("union.ibc.lightclients.scroll.v1.{}", Self::NAME) } } +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct IdentifiedL1MessageHash { + #[prost(uint64, tag = "1")] + pub queue_index: u64, + #[prost(bytes = "vec", tag = "2")] + pub message_hash: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for IdentifiedL1MessageHash { + const NAME: &'static str = "IdentifiedL1MessageHash"; + const PACKAGE: &'static str = "union.ibc.lightclients.scroll.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("union.ibc.lightclients.scroll.v1.{}", Self::NAME) + } +} // @@protoc_insertion_point(module) diff --git a/lib/block-message/Cargo.toml b/lib/block-message/Cargo.toml index 84df0013c7..86da7264d8 100644 --- a/lib/block-message/Cargo.toml +++ b/lib/block-message/Cargo.toml @@ -54,4 +54,5 @@ arbitrary = [ "unionlabs/arbitrary", "chain-utils/arbitrary", "contracts/arbitrary", + # "ethers/arbitrary", ] diff --git a/lib/chain-utils/src/scroll.rs b/lib/chain-utils/src/scroll.rs index efbe2f38c0..d3fc37e2fd 100644 --- a/lib/chain-utils/src/scroll.rs +++ b/lib/chain-utils/src/scroll.rs @@ -45,11 +45,17 @@ pub struct Scroll { pub l1: Ethereum, pub rollup_contract_address: H160, + /// [ScrollChain.finalizedStateRoots](https://github.com/scroll-tech/scroll/blob/71f88b04f5a69196138c8cec63a75cf1f0ba2d99/contracts/src/L1/rollup/ScrollChain.sol#L159) pub rollup_finalized_state_roots_slot: U256, + /// [ScrollChain.lastFinalizedBatchIndex](https://github.com/scroll-tech/scroll/blob/71f88b04f5a69196138c8cec63a75cf1f0ba2d99/contracts/src/L1/rollup/ScrollChain.sol#L153) pub rollup_last_finalized_batch_index_slot: U256, + /// [ScrollChain.messageQueue](https://github.com/scroll-tech/scroll/blob/71f88b04f5a69196138c8cec63a75cf1f0ba2d99/contracts/src/L1/rollup/ScrollChain.sol#L128) pub rollup_message_queue_slot: U256, + /// [ScrollChain.committedBatches](https://github.com/scroll-tech/scroll/blob/71f88b04f5a69196138c8cec63a75cf1f0ba2d99/contracts/src/L1/rollup/ScrollChain.sol#L156) + pub rollup_committed_batches_slot: U256, pub l1_client_id: ClientIdOf>, + /// GRPC url of Union, used to query the L1 state with [`Self::l1_client_id`]. pub union_grpc_url: String, } @@ -68,6 +74,7 @@ pub struct Config { pub rollup_finalized_state_roots_slot: U256, pub rollup_last_finalized_batch_index_slot: U256, pub rollup_message_queue_slot: U256, + pub rollup_committed_batches_slot: U256, pub l1_client_id: ClientIdOf>, pub l1: ethereum::Config, @@ -129,6 +136,7 @@ impl Scroll { union_grpc_url: config.union_grpc_url, scroll_rpc: scroll_rpc::JsonRpcClient::new(config.scroll_eth_rpc_api).await?, rollup_message_queue_slot: config.rollup_message_queue_slot, + rollup_committed_batches_slot: config.rollup_committed_batches_slot, }) } @@ -264,6 +272,7 @@ impl Chain for Scroll { rollup_finalized_state_roots_slot: self.rollup_finalized_state_roots_slot, ibc_contract_address: self.ibc_handler_address, ibc_commitment_slot: U256::from(0), + rollup_committed_batches_slot: self.rollup_committed_batches_slot, } } diff --git a/lib/relay-message/Cargo.toml b/lib/relay-message/Cargo.toml index 7ace70f5b7..4e5fca5084 100644 --- a/lib/relay-message/Cargo.toml +++ b/lib/relay-message/Cargo.toml @@ -25,6 +25,7 @@ num-bigint = { workspace = true } prost = { workspace = true } protos = { workspace = true, features = ["proto_full", "client"] } queue-msg = { workspace = true } +scroll-codec = { workspace = true, features = ["fetch"] } scroll-rpc = { workspace = true } scroll-verifier = { workspace = true } serde = { workspace = true, features = ["derive"] } diff --git a/lib/relay-message/src/chain_impls/scroll.rs b/lib/relay-message/src/chain_impls/scroll.rs index 18b8f77302..e29e6b2ead 100644 --- a/lib/relay-message/src/chain_impls/scroll.rs +++ b/lib/relay-message/src/chain_impls/scroll.rs @@ -1,10 +1,13 @@ -use std::{collections::VecDeque, marker::PhantomData}; +use std::{ + collections::{BTreeMap, VecDeque}, + marker::PhantomData, +}; use chain_utils::{ ethereum::{EthereumChain, EthereumChainExt, IbcHandlerExt}, scroll::Scroll, }; -use ethers::providers::Middleware; +use ethers::{abi::AbiDecode, providers::Middleware}; use frunk::{hlist_pat, HList}; use queue_msg::{ aggregate, @@ -163,6 +166,21 @@ where ibc_contract_address: c.ibc_handler_address, }), )), + fetch(id( + c.chain_id(), + Fetch::specific(FetchBatchHashProof { + height: update_info.update_to, + committed_batches_slot: c.rollup_committed_batches_slot, + rollup_contract_address: c.rollup_contract_address, + }), + )), + fetch(id( + c.chain_id(), + Fetch::specific(FetchCommitBatchTransactionInput { + height: update_info.update_to, + rollup_contract_address: c.rollup_contract_address, + }), + )), ], [], id( @@ -277,13 +295,13 @@ where .batch_index_of_beacon_slot(height.revision_height) .await; - let finalized_root_proof = scroll + let batch_hash_proof = scroll .l1 .provider .get_proof( ethers::types::H160::from(rollup_contract_address), vec![H256( - scroll_verifier::verify::finalized_state_root_key( + scroll_verifier::verify::batch_index_mapping_key( finalized_root_slot, batch_index.into(), ) @@ -301,7 +319,7 @@ where .await .unwrap(); - let proof = match <[_; 1]>::try_from(finalized_root_proof.storage_proof) { + let proof = match <[_; 1]>::try_from(batch_hash_proof.storage_proof) { Ok([proof]) => proof, Err(invalid) => { panic!("received invalid response from eth_getProof, expected length of 1 but got `{invalid:#?}`"); @@ -360,6 +378,110 @@ where __marker: PhantomData, }) } + Self::FetchBatchHashProof(FetchBatchHashProof { + height, + committed_batches_slot, + rollup_contract_address, + }) => { + let batch_index = scroll + .batch_index_of_beacon_slot(height.revision_height) + .await; + + let batch_hash_proof = scroll + .l1 + .provider + .get_proof( + ethers::types::H160::from(rollup_contract_address), + vec![H256( + scroll_verifier::verify::batch_index_mapping_key( + committed_batches_slot, + batch_index.into(), + ) + .to_be_bytes(), + ) + .into()], + Some(ethers::types::BlockId::Number( + scroll + .l1 + .execution_height_of_beacon_slot(height.revision_height) + .await + .into(), + )), + ) + .await + .unwrap(); + + let proof = match <[_; 1]>::try_from(batch_hash_proof.storage_proof) { + Ok([proof]) => proof, + Err(invalid) => { + panic!("received invalid response from eth_getProof, expected length of 1 but got `{invalid:#?}`"); + } + }; + + Data::specific(BatchHashProof { + height, + batch_index, + proof: StorageProof { + proofs: [unionlabs::ibc::lightclients::ethereum::proof::Proof { + key: U256::from_be_bytes(proof.key.to_fixed_bytes()), + value: proof.value.into(), + proof: proof + .proof + .into_iter() + .map(|bytes| bytes.to_vec()) + .collect(), + }] + .to_vec(), + }, + __marker: PhantomData, + }) + } + ScrollFetch::FetchCommitBatchTransactionInput(FetchCommitBatchTransactionInput { + height, + // TODO: This needs to be passed to `scroll_codec::fetch_l1_message_hashes` + rollup_contract_address: _, + }) => { + let batch_index = scroll + .batch_index_of_beacon_slot(height.revision_height) + .await; + + let batch = scroll.scroll_api_client.batch(batch_index).await; + + let tx = scroll + .l1 + .provider + .get_transaction(batch.batch.commit_tx_hash) + .await + .unwrap() + .unwrap(); + let calldata = tx.input.to_vec(); + + let blob_versioned_hash = tx + .blob_versioned_hashes + .unwrap_or_default() + .first() + .map(|x| H256(x.0)); + + let message_hashes = scroll_codec::fetch_l1_message_hashes( + scroll.l1.provider.as_ref(), + scroll + .l1 + .execution_height_of_beacon_slot(height.revision_height) + .await, + ::decode(&calldata).unwrap(), + ) + .await + .unwrap(); + + Data::specific(CommitBatchTransactionInput { + height, + batch_index, + message_hashes, + calldata, + blob_versioned_hash, + __marker: PhantomData, + }) + } }; data(id::(scroll.chain_id, msg)) @@ -380,6 +502,8 @@ pub enum ScrollFetch { FetchScrollFinalizedRootProof(FetchScrollFinalizedRootProof), // - ibc contract root against finalized root on L2 FetchIbcContractRootProof(FetchIbcContractRootProof), + FetchBatchHashProof(FetchBatchHashProof), + FetchCommitBatchTransactionInput(FetchCommitBatchTransactionInput), } #[queue_msg] @@ -397,6 +521,13 @@ pub struct FetchLatestBatchIndexProof { pub rollup_contract_address: H160, } +#[queue_msg] +pub struct FetchBatchHashProof { + pub height: HeightOf, + pub committed_batches_slot: U256, + pub rollup_contract_address: H160, +} + #[queue_msg] pub struct FetchScrollFinalizedRootProof { // the height to update to @@ -405,6 +536,13 @@ pub struct FetchScrollFinalizedRootProof { pub rollup_contract_address: H160, } +#[queue_msg] +pub struct FetchCommitBatchTransactionInput { + // the height to update to + pub height: HeightOf, + pub rollup_contract_address: H160, +} + #[queue_msg] pub struct FetchIbcContractRootProof { // the height to update to @@ -419,6 +557,8 @@ pub enum ScrollData { LatestBatchIndexProof(LatestBatchIndexProof), ScrollFinalizedRootProof(ScrollFinalizedRootProof), IbcContractRootProof(IbcContractRootProof), + BatchHashProof(BatchHashProof), + CommitBatchTransactionInput(CommitBatchTransactionInput), } const _: () = { @@ -430,6 +570,8 @@ const _: () = { LatestBatchIndexProof(LatestBatchIndexProof), ScrollFinalizedRootProof(ScrollFinalizedRootProof), IbcContractRootProof(IbcContractRootProof), + BatchHashProof(BatchHashProof), + CommitBatchTransactionInput(CommitBatchTransactionInput), ), } }; @@ -447,10 +589,18 @@ pub struct LatestBatchIndexProof<#[cover] Tr: ChainExt> { pub proof: StorageProof, } +#[queue_msg] +pub struct BatchHashProof<#[cover] Tr: ChainExt> { + pub height: HeightOf, + pub batch_index: u64, + pub proof: StorageProof, +} + #[queue_msg] pub struct ScrollFinalizedRootProof<#[cover] Tr: ChainExt> { pub height: HeightOf, pub batch_index: u64, + // TODO: Remove this field as it is present in proof[0].value pub finalized_state_root: U256, pub proof: StorageProof, } @@ -461,6 +611,18 @@ pub struct IbcContractRootProof<#[cover] Tr: ChainExt> { pub proof: AccountProof, } +#[queue_msg] +pub struct CommitBatchTransactionInput<#[cover] Tr: ChainExt> { + pub height: HeightOf, + pub batch_index: u64, + #[serde(with = "::serde_utils::hex_string")] + #[debug(wrap = ::serde_utils::fmt::DebugAsHex)] + pub calldata: Vec, + #[serde(with = "::serde_utils::map_numeric_keys_as_string")] + pub message_hashes: BTreeMap, + pub blob_versioned_hash: Option, +} + #[queue_msg] #[derive(enumorph::Enumorph)] pub enum ScrollAggregate { @@ -478,6 +640,8 @@ where Identified>: IsAggregateData, Identified>: IsAggregateData, Identified>: IsAggregateData, + Identified>: IsAggregateData, + Identified>: IsAggregateData, AnyLightClientIdentified: From)>, AnyLightClientIdentified: From)>, @@ -503,6 +667,8 @@ where Identified>: IsAggregateData, Identified>: IsAggregateData, Identified>: IsAggregateData, + Identified>: IsAggregateData, + Identified>: IsAggregateData, AnyLightClientIdentified: From)>, { @@ -511,6 +677,8 @@ where Identified>, Identified>, Identified>, + Identified>, + Identified>, ]; fn aggregate( @@ -523,7 +691,7 @@ where Identified { chain_id: rollup_contract_root_proof_chain_id, t: RollupContractRootProof { - height: _rollup_contract_root_proof_height, + height: rollup_contract_root_proof_height, proof: rollup_contract_root_proof, __marker: _ }, @@ -532,7 +700,7 @@ where Identified { chain_id: latest_batch_index_proof_chain_id, t: LatestBatchIndexProof { - height: _latest_batch_index_proof_height, + height: latest_batch_index_proof_height, latest_batch_index, proof: latest_batch_index_proof, __marker: _ @@ -542,10 +710,10 @@ where Identified { chain_id: scroll_finalized_root_proof_chain_id, t: ScrollFinalizedRootProof { - height: _scroll_finalized_root_proof_height, - batch_index: _batch_index, + height: scroll_finalized_root_proof_height, + batch_index: scroll_finalized_root_proof_batch_index, finalized_state_root, - proof: finalized_root_proof, + proof: scroll_finalized_root_proof, __marker: _ }, __marker: _, @@ -553,11 +721,33 @@ where Identified { chain_id: ibc_contract_root_proof_chain_id, t: IbcContractRootProof { - height: _ibc_contract_root_proof_height, + height: ibc_contract_root_proof_height, proof: ibc_contract_account_proof, __marker: _ }, __marker: _, + }, + Identified { + chain_id: batch_hash_proof_chain_id, + t: BatchHashProof { + height: batch_hash_proof_height, + batch_index: batch_hash_proof_batch_index, + proof: batch_hash_proof, + __marker: _, + }, + __marker: _, + }, + Identified { + chain_id: commit_batch_transaction_input_chain_id, + t: CommitBatchTransactionInput { + height: commit_batch_transaction_input_height, + batch_index: commit_batch_transaction_input_batch_index, + calldata, + message_hashes, + blob_versioned_hash, + __marker, + }, + __marker: _, } ]: Self::AggregatedData, ) -> QueueMsg { @@ -565,6 +755,35 @@ where assert_eq!(latest_batch_index_proof_chain_id, chain_id); assert_eq!(scroll_finalized_root_proof_chain_id, chain_id); assert_eq!(ibc_contract_root_proof_chain_id, chain_id); + assert_eq!(batch_hash_proof_chain_id, chain_id); + assert_eq!(commit_batch_transaction_input_chain_id, chain_id); + + assert_eq!( + rollup_contract_root_proof_height, + latest_batch_index_proof_height + ); + assert_eq!( + rollup_contract_root_proof_height, + scroll_finalized_root_proof_height + ); + assert_eq!( + rollup_contract_root_proof_height, + ibc_contract_root_proof_height + ); + assert_eq!(rollup_contract_root_proof_height, batch_hash_proof_height); + assert_eq!( + rollup_contract_root_proof_height, + commit_batch_transaction_input_height + ); + + assert_eq!( + scroll_finalized_root_proof_batch_index, + batch_hash_proof_batch_index + ); + assert_eq!( + scroll_finalized_root_proof_batch_index, + commit_batch_transaction_input_batch_index + ); effect(id::( req.counterparty_chain_id, @@ -574,10 +793,14 @@ where l1_height: req.update_to, l1_account_proof: rollup_contract_root_proof, l2_state_root: H256(finalized_state_root.to_be_bytes()), - l2_state_proof: finalized_root_proof, + l2_state_proof: scroll_finalized_root_proof, last_batch_index: latest_batch_index, last_batch_index_proof: latest_batch_index_proof, l2_ibc_account_proof: ibc_contract_account_proof, + batch_hash_proof, + commit_batch_calldata: calldata, + l1_message_hashes: message_hashes, + blob_versioned_hash, }, }), )) diff --git a/lib/relay-message/src/lib.rs b/lib/relay-message/src/lib.rs index bf4915739a..788ff72817 100644 --- a/lib/relay-message/src/lib.rs +++ b/lib/relay-message/src/lib.rs @@ -416,7 +416,7 @@ pub trait DoMsg: ChainExt { fn msg(&self, msg: Effect) -> impl Future> + '_; } -#[derive(Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize)] #[serde( bound(serialize = "T: Serialize", deserialize = "T: for<'d> Deserialize<'d>"), deny_unknown_fields @@ -540,3 +540,62 @@ mod sanity_checks { assert_impl_all!(UnionFetch, Ethereum>: DoFetch>); } + +#[cfg(test)] +mod tests { + use hex_literal::hex; + use unionlabs::{hash::H256, ibc::core::client::height::Height}; + + use super::*; + use crate::{chain_impls::scroll::ScrollData, data::Data}; + + #[test] + fn serde() { + let expected_json = + serde_json::to_string_pretty(&Data::>::specific(ScrollData::CommitBatchTransactionInput( + chain_impls::scroll::CommitBatchTransactionInput { + height: Height { + revision_number: 0, + revision_height: 4846816, + }, + batch_index: 70133, + calldata: hex_literal::hex!("1325aca00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000008c6000000000000000000000000000000000000000000000000000000000000000790100000000000111f4000000000000000000000000000fe405fbacc987e7de390501620837ba1e41f75bac2c2b7d000f75e2faffe788ba604601fc76d357b024e757ec6675fb6025c3aeecd166900598b22c5b0c5b8f65a9a1f8bfe15b0f7fe61c68a641727337a9e51f0fb66e79d2cf386761133b618fb94e0000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000005ce000000000000000000000000000000000000000000000000000000000000069400000000000000000000000000000000000000000000000000000000000007ac000000000000000000000000000000000000000000000000000000000000013395200000000003cc5f9000000006627e3e9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc5fa000000006627e3ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc5fb000000006627e3ef000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc5fc000000006627e3f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc5fd000000006627e3f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc5fe000000006627e3f8000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc5ff000000006627e3fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc600000000006627e3fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc601000000006627e401000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc602000000006627e404000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc603000000006627e407000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc604000000006627e40a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc605000000006627e40d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc606000000006627e410000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc607000000006627e413000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc608000000006627e416000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc609000000006627e419000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60a000000006627e41c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60b000000006627e41f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60c000000006627e422000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc60d000000006627e425000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60e000000006627e428000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60f000000006627e42b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc610000000006627e42e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc611000000006627e431000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc612000000006627e434000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc613000000006627e437000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc614000000006627e43a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc615000000006627e43d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc616000000006627e441000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc617000000006627e444000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc618000000006627e447000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc619000000006627e44a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc61a000000006627e44d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc61b000000006627e450000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc61c000000006627e453000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc61d000000006627e456000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc61e000000006627e459000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc61f000000006627e45c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc620000000006627e45f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc621000000006627e462000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc622000000006627e465000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc623000000006627e468000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc624000000006627e46b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc625000000006627e46e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc626000000006627e471000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc627000000006627e474000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc628000000006627e477000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc629000000006627e47a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62a000000006627e47d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62b000000006627e480000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62c000000006627e483000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62d000000006627e486000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62e000000006627e489000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62f000000006627e48c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc630000000006627e48f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc631000000006627e492000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc632000000006627e495000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc633000000006627e498000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc634000000006627e49b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc635000000006627e49e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc636000000006627e4a1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc637000000006627e4a4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc638000000006627e4a7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc639000000006627e4aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63a000000006627e4ad000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc63b000000006627e4b0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63c000000006627e4b3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63d000000006627e4b6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63e000000006627e4b9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63f000000006627e4bc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc640000000006627e4bf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc641000000006627e4c2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc642000000006627e4c5000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc643000000006627e4c8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc644000000006627e4cb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc645000000006627e4ce000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc646000000006627e4d1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc647000000006627e4d4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc648000000006627e4d7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc649000000006627e4da000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64a000000006627e4dd00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000000000000000000000000000000000000000000000000000000000000000013b15400000000003cc64b000000006627e4e0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64c000000006627e4e3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64d000000006627e4e6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64e000000006627e4e9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64f000000006627e4ec000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc650000000006627e4ef000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc651000000006627e4f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc652000000006627e4f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc653000000006627e4f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc654000000006627e4fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc655000000006627e4fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc656000000006627e501000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc657000000006627e504000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc658000000006627e507000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc659000000006627e50a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65a000000006627e50d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65b000000006627e510000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65c000000006627e513000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65d000000006627e516000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65e000000006627e519000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65f000000006627e51c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc660000000006627e51f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc661000000006627e522000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc662000000006627e525000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc663000000006627e529000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc664000000006627e52c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc665000000006627e52f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc666000000006627e532000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc667000000006627e535000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc668000000006627e538000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc669000000006627e53b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66a000000006627e53e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66b000000006627e541000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66c000000006627e544000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66d000000006627e547000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66e000000006627e54a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66f000000006627e54d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc670000000006627e550000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc671000000006627e553000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc672000000006627e556000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc673000000006627e559000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc674000000006627e55c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc675000000006627e55f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc676000000006627e562000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc677000000006627e565000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc678000000006627e568000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc679000000006627e56b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67a000000006627e56e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67b000000006627e571000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67c000000006627e574000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67d000000006627e577000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67e000000006627e57a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc67f000000006627e57d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc680000000006627e580000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc681000000006627e583000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc682000000006627e586000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc683000000006627e589000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc684000000006627e58c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc685000000006627e58f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc686000000006627e592000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc687000000006627e595000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc688000000006627e598000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc689000000006627e59b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68a000000006627e59e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68b000000006627e5a1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68c000000006627e5a5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68d000000006627e5a8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68e000000006627e5ab000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc68f000000006627e5ae000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc690000000006627e5b1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc691000000006627e5b4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc692000000006627e5b7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc693000000006627e5ba000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc694000000006627e5bd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc695000000006627e5c0000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc696000000006627e5c3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc697000000006627e5c6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc698000000006627e5c9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc699000000006627e5cc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc69a000000006627e5cf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc69b000000006627e5d2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc69c000000006627e5d5000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc69d000000006627e5d8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc69e000000006627e5db000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012854f00000000003cc69f000000006627e5de000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a0000000006627e5e1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a1000000006627e5e4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a2000000006627e5e7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a3000000006627e5ea000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a4000000006627e5ed000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a5000000006627e5f0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a6000000006627e5f3000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc6a7000000006627e5f6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a8000000006627e5f9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a9000000006627e5fc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6aa000000006627e5ff000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ab000000006627e602000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ac000000006627e605000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ad000000006627e608000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6ae000000006627e60b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6af000000006627e60e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b0000000006627e612000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b1000000006627e615000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6b2000000006627e618000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b3000000006627e61b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b4000000006627e61e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b5000000006627e621000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b6000000006627e624000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6b7000000006627e627000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b8000000006627e62a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b9000000006627e62d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ba000000006627e630000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6bb000000006627e633000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6bc000000006627e636000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6bd000000006627e639000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6be000000006627e63c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6bf000000006627e63f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c0000000006627e642000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c1000000006627e645000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c2000000006627e648000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c3000000006627e64b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c4000000006627e64e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c5000000006627e651000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6c6000000006627e654000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc6c7000000006627e657000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c8000000006627e65a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c9000000006627e65d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ca000000006627e660000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc6cb000000006627e663000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6cc000000006627e666000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6cd000000006627e669000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ce000000006627e66c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6cf000000006627e66f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6d0000000006627e672000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d1000000006627e675000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d2000000006627e679000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d3000000006627e67c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d4000000006627e67f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d5000000006627e682000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d6000000006627e685000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d7000000006627e688000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d8000000006627e68b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d9000000006627e68e000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6da000000006627e691000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6db000000006627e694000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6dc000000006627e697000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6dd000000006627e69a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6de000000006627e69d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6df000000006627e6a0000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6e0000000006627e6a3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e1000000006627e6a6000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6e2000000006627e6a9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e3000000006627e6ac000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e4000000006627e6af000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e5000000006627e6b2000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6e6000000006627e6b5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e7000000006627e6b8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e8000000006627e6bb000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6e9000000006627e6be000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ea000000006627e6c1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6eb000000006627e6c4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ec000000006627e6c7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ed000000006627e6ca000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011d14c00000000003cc6ee000000006627e6cd000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6ef000000006627e6d0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f0000000006627e6d3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f1000000006627e6d6000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6f2000000006627e6d9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f3000000006627e6dc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f4000000006627e6df000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f5000000006627e6e2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f6000000006627e6e6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f7000000006627e6e9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6f8000000006627e6ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f9000000006627e6ef000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6fa000000006627e6f2000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6fb000000006627e6f5000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6fc000000006627e6f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6fd000000006627e6fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6fe000000006627e6fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ff000000006627e701000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc700000000006627e704000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc701000000006627e707000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc702000000006627e70a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc703000000006627e70d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc704000000006627e710000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc705000000006627e713000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc706000000006627e716000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc707000000006627e719000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc708000000006627e71c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc709000000006627e71f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc70a000000006627e722000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc70b000000006627e725000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc70c000000006627e728000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc70d000000006627e72b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc70e000000006627e72e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc70f000000006627e731000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc710000000006627e734000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc711000000006627e737000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc712000000006627e73a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc713000000006627e73d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc714000000006627e740000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc715000000006627e743000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc716000000006627e746000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc717000000006627e749000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc718000000006627e74c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc719000000006627e74f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc71a000000006627e752000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc71b000000006627e755000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc71c000000006627e759000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc71d000000006627e75c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc71e000000006627e75f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc71f000000006627e762000000000000000000000000000000000000000000000000000000000000000000000000009896800002000100000000003cc720000000006627e765000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc721000000006627e768000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc722000000006627e76b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc723000000006627e76e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc724000000006627e771000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc725000000006627e774000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc726000000006627e777000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc727000000006627e77a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc728000000006627e77d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc729000000006627e780000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72a000000006627e783000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72b000000006627e786000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72c000000006627e789000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72d000000006627e78c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72e000000006627e78f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72f000000006627e792000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc730000000006627e795000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc731000000006627e798000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc732000000006627e79b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc733000000006627e79e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc734000000006627e7a1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc735000000006627e7a4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc736000000006627e7a7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc737000000006627e7aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc738000000006627e7ad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc739000000006627e7b000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb54300000000003cc73a000000006627e7b3000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc73b000000006627e7b6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc73c000000006627e7b9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc73d000000006627e7bc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc73e000000006627e7bf000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc73f000000006627e7c2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc740000000006627e7c5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc741000000006627e7c8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc742000000006627e7cb000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc743000000006627e7ce000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc744000000006627e7d1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc745000000006627e7d4000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc746000000006627e7d7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc747000000006627e7da000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc748000000006627e7dd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc749000000006627e7e0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc74a000000006627e7e3000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc74b000000006627e7e6000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc74c000000006627e7e9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc74d000000006627e7ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc74e000000006627e7ef000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc74f000000006627e7f2000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc750000000006627e7f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc751000000006627e7f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc752000000006627e7fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc753000000006627e7fe000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc754000000006627e801000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc755000000006627e804000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc756000000006627e807000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc757000000006627e80a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc758000000006627e80d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc759000000006627e810000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75a000000006627e813000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75b000000006627e816000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75c000000006627e819000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75d000000006627e81c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75e000000006627e81f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75f000000006627e822000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc760000000006627e825000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc761000000006627e828000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc762000000006627e82b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc763000000006627e82e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc764000000006627e831000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc765000000006627e834000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc766000000006627e837000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc767000000006627e83a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc768000000006627e83d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc769000000006627e840000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76a000000006627e843000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76b000000006627e846000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc76c000000006627e849000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76d000000006627e84c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76e000000006627e84f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76f000000006627e852000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc770000000006627e855000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc771000000006627e858000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc772000000006627e85b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc773000000006627e85e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc774000000006627e861000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc775000000006627e864000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc776000000006627e867000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc777000000006627e86a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc778000000006627e86d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc779000000006627e870000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc77a000000006627e874000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc77b000000006627e877000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc77c000000006627e87a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c313400000000003cc77d000000006627e87d000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc77e000000006627e880000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc77f000000006627e883000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc780000000006627e886000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc781000000006627e889000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc782000000006627e88c000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc783000000006627e88f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc784000000006627e892000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc785000000006627e895000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc786000000006627e898000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc787000000006627e89b000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc788000000006627e89e000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc789000000006627e8a1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78a000000006627e8a4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78b000000006627e8a7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78c000000006627e8aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78d000000006627e8ad000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc78e000000006627e8b0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78f000000006627e8b4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc790000000006627e8b7000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc791000000006627e8ba000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc792000000006627e8bd000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc793000000006627e8c0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc794000000006627e8c3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc795000000006627e8c6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc796000000006627e8c9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc797000000006627e8cc000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc798000000006627e8cf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc799000000006627e8d2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc79a000000006627e8d5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc79b000000006627e8d8000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc79c000000006627e8db000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc79d000000006627e8de000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc79e000000006627e8e1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc79f000000006627e8e4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a0000000006627e8e7000000000000000000000000000000000000000000000000000000000000000000000000009896800004000300000000003cc7a1000000006627e8ed000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a2000000006627e8f0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a3000000006627e8f3000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7a4000000006627e8f6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a5000000006627e8f9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a6000000006627e8fc000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7a7000000006627e8ff000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a8000000006627e902000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a9000000006627e906000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7aa000000006627e909000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7ab000000006627e90c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ac000000006627e90f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ad000000006627e912000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7ae000000006627e915000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7af000000006627e918000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7b0000000006627e91b000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011594a00000000003cc7b1000000006627e91e000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7b2000000006627e921000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b3000000006627e924000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b4000000006627e927000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b5000000006627e92a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7b6000000006627e92d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b7000000006627e930000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b8000000006627e933000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b9000000006627e936000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ba000000006627e939000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7bb000000006627e93c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7bc000000006627e93f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7bd000000006627e942000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7be000000006627e945000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7bf000000006627e948000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c0000000006627e94b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c1000000006627e94e000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7c2000000006627e951000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7c3000000006627e954000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c4000000006627e957000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c5000000006627e95a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c6000000006627e95d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c7000000006627e960000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c8000000006627e963000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c9000000006627e966000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ca000000006627e96a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7cb000000006627e96d000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc7cc000000006627e970000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7cd000000006627e973000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ce000000006627e976000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7cf000000006627e979000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d0000000006627e97c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d1000000006627e97f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d2000000006627e982000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d3000000006627e985000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7d4000000006627e988000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d5000000006627e98b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d6000000006627e98e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d7000000006627e991000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7d8000000006627e994000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7d9000000006627e997000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7da000000006627e99a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7db000000006627e99d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7dc000000006627e9a0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7dd000000006627e9a3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7de000000006627e9a6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7df000000006627e9a9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e0000000006627e9ac000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e1000000006627e9af000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e2000000006627e9b2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e3000000006627e9b5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e4000000006627e9b8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e5000000006627e9bb000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7e6000000006627e9be000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e7000000006627e9c1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e8000000006627e9c4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e9000000006627e9c7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ea000000006627e9ca000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7eb000000006627e9ce000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ec000000006627e9d1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7ed000000006627e9d4000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7ee000000006627e9d7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ef000000006627e9da000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f0000000006627e9dd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f1000000006627e9e0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f2000000006627e9e3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f3000000006627e9e6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f4000000006627e9e9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f5000000006627e9ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f6000000006627e9ef000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7f7000000006627e9f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f8000000006627e9f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f9000000006627e9f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7fa000000006627e9fb000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000000000000000000000000000000000000000000000000000000000000000000000102d4500000000003cc7fb000000006627e9fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7fc000000006627ea01000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7fd000000006627ea04000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7fe000000006627ea07000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ff000000006627ea0a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc800000000006627ea0d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc801000000006627ea10000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc802000000006627ea13000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc803000000006627ea16000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc804000000006627ea19000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc805000000006627ea1c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc806000000006627ea1f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc807000000006627ea22000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc808000000006627ea25000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc809000000006627ea28000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc80a000000006627ea2b000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc80b000000006627ea2e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc80c000000006627ea31000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc80d000000006627ea34000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc80e000000006627ea37000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc80f000000006627ea3a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc810000000006627ea3d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc811000000006627ea40000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc812000000006627ea43000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc813000000006627ea46000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc814000000006627ea49000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc815000000006627ea4c000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc816000000006627ea4f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc817000000006627ea52000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc818000000006627ea55000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc819000000006627ea58000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc81a000000006627ea5b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc81b000000006627ea5e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc81c000000006627ea61000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc81d000000006627ea64000000000000000000000000000000000000000000000000000000000000000000000000009896800002000100000000003cc81e000000006627ea67000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc81f000000006627ea6a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc820000000006627ea6d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc821000000006627ea70000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc822000000006627ea73000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc823000000006627ea76000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc824000000006627ea79000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc825000000006627ea7c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc826000000006627ea80000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc827000000006627ea83000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc828000000006627ea86000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc829000000006627ea89000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc82a000000006627ea8c000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc82b000000006627ea8f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc82c000000006627ea92000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc82d000000006627ea95000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc82e000000006627ea98000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc82f000000006627ea9b000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc830000000006627ea9e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc831000000006627eaa1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc832000000006627eaa4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc833000000006627eaa7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc834000000006627eaaa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc835000000006627eaad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc836000000006627eab0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc837000000006627eab3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc838000000006627eab6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc839000000006627eab9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc83a000000006627eabc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc83b000000006627eabf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc83c000000006627eac2000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc83d000000006627eac6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc83e000000006627eac9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc83f000000006627eacc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000").to_vec(), + message_hashes: [ + (1041413, H256(hex!("2309c1909b298c03f5b2c4531b75ce924a18f8f01ecd11706c046bf5be121121"))), + (1041414, H256(hex!("5a10e631df8a1843b077d6bfa04157a9e4ebcad949c594bec13fd5fc91987e9a"))), + (1041415, H256(hex!("b01db83451d4edab828943ad9dea86ac05b50d1f6bcedd4a2fde88d6d598d102"))), + (1041416, H256(hex!("6cd3b0b235cd2b5170a37871354a31847ed5caa21320d59fcdbe89d532fcc161"))), + (1041417, H256(hex!("e11ab5fae2c94c6a509afebbdadc0104ef1d560000275a8532b18571e4886e33"))) + ].into_iter().collect(), + blob_versioned_hash: Some(H256(hex!("0127c42381cb4014aeaa54fcc188be37d9aa9a5aa1e79fd01aaad7dd37c8575d"))), + __marker: PhantomData, + }, + ))) + .unwrap(); + + println!("{expected_json}"); + + let json = r#" + { + "@type": "commit_batch_transaction_input", + "@value": { + "height": { + "revision_height": 4846816, + "revision_number": 0 + }, + "calldata": "0x1325aca00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000008c6000000000000000000000000000000000000000000000000000000000000000790100000000000111f4000000000000000000000000000fe405fbacc987e7de390501620837ba1e41f75bac2c2b7d000f75e2faffe788ba604601fc76d357b024e757ec6675fb6025c3aeecd166900598b22c5b0c5b8f65a9a1f8bfe15b0f7fe61c68a641727337a9e51f0fb66e79d2cf386761133b618fb94e0000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000005ce000000000000000000000000000000000000000000000000000000000000069400000000000000000000000000000000000000000000000000000000000007ac000000000000000000000000000000000000000000000000000000000000013395200000000003cc5f9000000006627e3e9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc5fa000000006627e3ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc5fb000000006627e3ef000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc5fc000000006627e3f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc5fd000000006627e3f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc5fe000000006627e3f8000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc5ff000000006627e3fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc600000000006627e3fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc601000000006627e401000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc602000000006627e404000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc603000000006627e407000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc604000000006627e40a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc605000000006627e40d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc606000000006627e410000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc607000000006627e413000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc608000000006627e416000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc609000000006627e419000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60a000000006627e41c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60b000000006627e41f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60c000000006627e422000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc60d000000006627e425000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60e000000006627e428000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc60f000000006627e42b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc610000000006627e42e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc611000000006627e431000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc612000000006627e434000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc613000000006627e437000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc614000000006627e43a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc615000000006627e43d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc616000000006627e441000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc617000000006627e444000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc618000000006627e447000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc619000000006627e44a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc61a000000006627e44d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc61b000000006627e450000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc61c000000006627e453000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc61d000000006627e456000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc61e000000006627e459000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc61f000000006627e45c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc620000000006627e45f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc621000000006627e462000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc622000000006627e465000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc623000000006627e468000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc624000000006627e46b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc625000000006627e46e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc626000000006627e471000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc627000000006627e474000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc628000000006627e477000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc629000000006627e47a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62a000000006627e47d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62b000000006627e480000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62c000000006627e483000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62d000000006627e486000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62e000000006627e489000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc62f000000006627e48c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc630000000006627e48f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc631000000006627e492000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc632000000006627e495000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc633000000006627e498000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc634000000006627e49b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc635000000006627e49e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc636000000006627e4a1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc637000000006627e4a4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc638000000006627e4a7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc639000000006627e4aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63a000000006627e4ad000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc63b000000006627e4b0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63c000000006627e4b3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63d000000006627e4b6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63e000000006627e4b9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc63f000000006627e4bc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc640000000006627e4bf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc641000000006627e4c2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc642000000006627e4c5000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc643000000006627e4c8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc644000000006627e4cb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc645000000006627e4ce000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc646000000006627e4d1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc647000000006627e4d4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc648000000006627e4d7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc649000000006627e4da000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64a000000006627e4dd00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000000000000000000000000000000000000000000000000000000000000000013b15400000000003cc64b000000006627e4e0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64c000000006627e4e3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64d000000006627e4e6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64e000000006627e4e9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc64f000000006627e4ec000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc650000000006627e4ef000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc651000000006627e4f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc652000000006627e4f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc653000000006627e4f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc654000000006627e4fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc655000000006627e4fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc656000000006627e501000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc657000000006627e504000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc658000000006627e507000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc659000000006627e50a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65a000000006627e50d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65b000000006627e510000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65c000000006627e513000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65d000000006627e516000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65e000000006627e519000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc65f000000006627e51c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc660000000006627e51f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc661000000006627e522000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc662000000006627e525000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc663000000006627e529000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc664000000006627e52c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc665000000006627e52f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc666000000006627e532000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc667000000006627e535000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc668000000006627e538000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc669000000006627e53b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66a000000006627e53e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66b000000006627e541000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66c000000006627e544000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66d000000006627e547000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66e000000006627e54a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc66f000000006627e54d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc670000000006627e550000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc671000000006627e553000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc672000000006627e556000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc673000000006627e559000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc674000000006627e55c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc675000000006627e55f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc676000000006627e562000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc677000000006627e565000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc678000000006627e568000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc679000000006627e56b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67a000000006627e56e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67b000000006627e571000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67c000000006627e574000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67d000000006627e577000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc67e000000006627e57a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc67f000000006627e57d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc680000000006627e580000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc681000000006627e583000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc682000000006627e586000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc683000000006627e589000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc684000000006627e58c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc685000000006627e58f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc686000000006627e592000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc687000000006627e595000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc688000000006627e598000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc689000000006627e59b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68a000000006627e59e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68b000000006627e5a1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68c000000006627e5a5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68d000000006627e5a8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc68e000000006627e5ab000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc68f000000006627e5ae000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc690000000006627e5b1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc691000000006627e5b4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc692000000006627e5b7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc693000000006627e5ba000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc694000000006627e5bd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc695000000006627e5c0000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc696000000006627e5c3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc697000000006627e5c6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc698000000006627e5c9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc699000000006627e5cc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc69a000000006627e5cf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc69b000000006627e5d2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc69c000000006627e5d5000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc69d000000006627e5d8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc69e000000006627e5db000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012854f00000000003cc69f000000006627e5de000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a0000000006627e5e1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a1000000006627e5e4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a2000000006627e5e7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a3000000006627e5ea000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a4000000006627e5ed000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a5000000006627e5f0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a6000000006627e5f3000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc6a7000000006627e5f6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a8000000006627e5f9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6a9000000006627e5fc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6aa000000006627e5ff000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ab000000006627e602000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ac000000006627e605000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ad000000006627e608000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6ae000000006627e60b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6af000000006627e60e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b0000000006627e612000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b1000000006627e615000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6b2000000006627e618000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b3000000006627e61b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b4000000006627e61e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b5000000006627e621000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b6000000006627e624000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6b7000000006627e627000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b8000000006627e62a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6b9000000006627e62d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ba000000006627e630000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6bb000000006627e633000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6bc000000006627e636000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6bd000000006627e639000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6be000000006627e63c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6bf000000006627e63f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c0000000006627e642000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c1000000006627e645000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c2000000006627e648000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c3000000006627e64b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c4000000006627e64e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c5000000006627e651000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6c6000000006627e654000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc6c7000000006627e657000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c8000000006627e65a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6c9000000006627e65d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ca000000006627e660000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc6cb000000006627e663000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6cc000000006627e666000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6cd000000006627e669000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ce000000006627e66c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6cf000000006627e66f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6d0000000006627e672000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d1000000006627e675000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d2000000006627e679000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d3000000006627e67c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d4000000006627e67f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d5000000006627e682000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d6000000006627e685000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d7000000006627e688000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d8000000006627e68b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6d9000000006627e68e000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6da000000006627e691000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6db000000006627e694000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6dc000000006627e697000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6dd000000006627e69a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6de000000006627e69d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6df000000006627e6a0000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6e0000000006627e6a3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e1000000006627e6a6000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6e2000000006627e6a9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e3000000006627e6ac000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e4000000006627e6af000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e5000000006627e6b2000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6e6000000006627e6b5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e7000000006627e6b8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6e8000000006627e6bb000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6e9000000006627e6be000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ea000000006627e6c1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6eb000000006627e6c4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ec000000006627e6c7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ed000000006627e6ca000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011d14c00000000003cc6ee000000006627e6cd000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6ef000000006627e6d0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f0000000006627e6d3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f1000000006627e6d6000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6f2000000006627e6d9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f3000000006627e6dc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f4000000006627e6df000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f5000000006627e6e2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f6000000006627e6e6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f7000000006627e6e9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6f8000000006627e6ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6f9000000006627e6ef000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6fa000000006627e6f2000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6fb000000006627e6f5000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc6fc000000006627e6f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6fd000000006627e6fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6fe000000006627e6fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc6ff000000006627e701000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc700000000006627e704000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc701000000006627e707000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc702000000006627e70a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc703000000006627e70d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc704000000006627e710000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc705000000006627e713000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc706000000006627e716000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc707000000006627e719000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc708000000006627e71c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc709000000006627e71f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc70a000000006627e722000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc70b000000006627e725000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc70c000000006627e728000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc70d000000006627e72b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc70e000000006627e72e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc70f000000006627e731000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc710000000006627e734000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc711000000006627e737000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc712000000006627e73a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc713000000006627e73d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc714000000006627e740000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc715000000006627e743000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc716000000006627e746000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc717000000006627e749000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc718000000006627e74c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc719000000006627e74f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc71a000000006627e752000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc71b000000006627e755000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc71c000000006627e759000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc71d000000006627e75c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc71e000000006627e75f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc71f000000006627e762000000000000000000000000000000000000000000000000000000000000000000000000009896800002000100000000003cc720000000006627e765000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc721000000006627e768000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc722000000006627e76b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc723000000006627e76e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc724000000006627e771000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc725000000006627e774000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc726000000006627e777000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc727000000006627e77a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc728000000006627e77d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc729000000006627e780000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72a000000006627e783000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72b000000006627e786000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72c000000006627e789000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72d000000006627e78c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72e000000006627e78f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc72f000000006627e792000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc730000000006627e795000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc731000000006627e798000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc732000000006627e79b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc733000000006627e79e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc734000000006627e7a1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc735000000006627e7a4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc736000000006627e7a7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc737000000006627e7aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc738000000006627e7ad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc739000000006627e7b000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb54300000000003cc73a000000006627e7b3000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc73b000000006627e7b6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc73c000000006627e7b9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc73d000000006627e7bc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc73e000000006627e7bf000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc73f000000006627e7c2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc740000000006627e7c5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc741000000006627e7c8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc742000000006627e7cb000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc743000000006627e7ce000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc744000000006627e7d1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc745000000006627e7d4000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc746000000006627e7d7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc747000000006627e7da000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc748000000006627e7dd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc749000000006627e7e0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc74a000000006627e7e3000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc74b000000006627e7e6000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc74c000000006627e7e9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc74d000000006627e7ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc74e000000006627e7ef000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc74f000000006627e7f2000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc750000000006627e7f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc751000000006627e7f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc752000000006627e7fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc753000000006627e7fe000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc754000000006627e801000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc755000000006627e804000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc756000000006627e807000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc757000000006627e80a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc758000000006627e80d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc759000000006627e810000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75a000000006627e813000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75b000000006627e816000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75c000000006627e819000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75d000000006627e81c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75e000000006627e81f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc75f000000006627e822000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc760000000006627e825000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc761000000006627e828000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc762000000006627e82b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc763000000006627e82e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc764000000006627e831000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc765000000006627e834000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc766000000006627e837000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc767000000006627e83a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc768000000006627e83d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc769000000006627e840000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76a000000006627e843000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76b000000006627e846000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc76c000000006627e849000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76d000000006627e84c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76e000000006627e84f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc76f000000006627e852000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc770000000006627e855000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc771000000006627e858000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc772000000006627e85b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc773000000006627e85e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc774000000006627e861000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc775000000006627e864000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc776000000006627e867000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc777000000006627e86a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc778000000006627e86d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc779000000006627e870000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc77a000000006627e874000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc77b000000006627e877000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc77c000000006627e87a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c313400000000003cc77d000000006627e87d000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc77e000000006627e880000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc77f000000006627e883000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc780000000006627e886000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc781000000006627e889000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc782000000006627e88c000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc783000000006627e88f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc784000000006627e892000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc785000000006627e895000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc786000000006627e898000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc787000000006627e89b000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc788000000006627e89e000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc789000000006627e8a1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78a000000006627e8a4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78b000000006627e8a7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78c000000006627e8aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78d000000006627e8ad000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc78e000000006627e8b0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc78f000000006627e8b4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc790000000006627e8b7000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc791000000006627e8ba000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc792000000006627e8bd000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc793000000006627e8c0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc794000000006627e8c3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc795000000006627e8c6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc796000000006627e8c9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc797000000006627e8cc000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc798000000006627e8cf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc799000000006627e8d2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc79a000000006627e8d5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc79b000000006627e8d8000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc79c000000006627e8db000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc79d000000006627e8de000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc79e000000006627e8e1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc79f000000006627e8e4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a0000000006627e8e7000000000000000000000000000000000000000000000000000000000000000000000000009896800004000300000000003cc7a1000000006627e8ed000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a2000000006627e8f0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a3000000006627e8f3000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7a4000000006627e8f6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a5000000006627e8f9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a6000000006627e8fc000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7a7000000006627e8ff000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a8000000006627e902000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7a9000000006627e906000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7aa000000006627e909000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7ab000000006627e90c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ac000000006627e90f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ad000000006627e912000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7ae000000006627e915000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7af000000006627e918000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7b0000000006627e91b000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011594a00000000003cc7b1000000006627e91e000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7b2000000006627e921000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b3000000006627e924000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b4000000006627e927000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b5000000006627e92a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7b6000000006627e92d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b7000000006627e930000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b8000000006627e933000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7b9000000006627e936000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ba000000006627e939000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7bb000000006627e93c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7bc000000006627e93f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7bd000000006627e942000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7be000000006627e945000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7bf000000006627e948000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c0000000006627e94b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c1000000006627e94e000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7c2000000006627e951000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7c3000000006627e954000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c4000000006627e957000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c5000000006627e95a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c6000000006627e95d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c7000000006627e960000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c8000000006627e963000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7c9000000006627e966000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ca000000006627e96a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7cb000000006627e96d000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc7cc000000006627e970000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7cd000000006627e973000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ce000000006627e976000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7cf000000006627e979000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d0000000006627e97c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d1000000006627e97f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d2000000006627e982000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d3000000006627e985000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7d4000000006627e988000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d5000000006627e98b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d6000000006627e98e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7d7000000006627e991000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7d8000000006627e994000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7d9000000006627e997000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7da000000006627e99a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7db000000006627e99d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7dc000000006627e9a0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7dd000000006627e9a3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7de000000006627e9a6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7df000000006627e9a9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e0000000006627e9ac000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e1000000006627e9af000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e2000000006627e9b2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e3000000006627e9b5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e4000000006627e9b8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e5000000006627e9bb000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7e6000000006627e9be000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e7000000006627e9c1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e8000000006627e9c4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7e9000000006627e9c7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ea000000006627e9ca000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7eb000000006627e9ce000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ec000000006627e9d1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7ed000000006627e9d4000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7ee000000006627e9d7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ef000000006627e9da000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f0000000006627e9dd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f1000000006627e9e0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f2000000006627e9e3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f3000000006627e9e6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f4000000006627e9e9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f5000000006627e9ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f6000000006627e9ef000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc7f7000000006627e9f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f8000000006627e9f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7f9000000006627e9f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7fa000000006627e9fb000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000000000000000000000000000000000000000000000000000000000000000000000102d4500000000003cc7fb000000006627e9fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7fc000000006627ea01000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7fd000000006627ea04000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7fe000000006627ea07000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc7ff000000006627ea0a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc800000000006627ea0d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc801000000006627ea10000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc802000000006627ea13000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc803000000006627ea16000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc804000000006627ea19000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc805000000006627ea1c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc806000000006627ea1f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc807000000006627ea22000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc808000000006627ea25000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc809000000006627ea28000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc80a000000006627ea2b000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc80b000000006627ea2e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc80c000000006627ea31000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc80d000000006627ea34000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc80e000000006627ea37000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc80f000000006627ea3a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc810000000006627ea3d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc811000000006627ea40000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc812000000006627ea43000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc813000000006627ea46000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc814000000006627ea49000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc815000000006627ea4c000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc816000000006627ea4f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc817000000006627ea52000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc818000000006627ea55000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc819000000006627ea58000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc81a000000006627ea5b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc81b000000006627ea5e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc81c000000006627ea61000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc81d000000006627ea64000000000000000000000000000000000000000000000000000000000000000000000000009896800002000100000000003cc81e000000006627ea67000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc81f000000006627ea6a000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc820000000006627ea6d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc821000000006627ea70000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc822000000006627ea73000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc823000000006627ea76000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc824000000006627ea79000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc825000000006627ea7c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc826000000006627ea80000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc827000000006627ea83000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc828000000006627ea86000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc829000000006627ea89000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc82a000000006627ea8c000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc82b000000006627ea8f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc82c000000006627ea92000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000003cc82d000000006627ea95000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc82e000000006627ea98000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc82f000000006627ea9b000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc830000000006627ea9e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc831000000006627eaa1000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc832000000006627eaa4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc833000000006627eaa7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc834000000006627eaaa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc835000000006627eaad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc836000000006627eab0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc837000000006627eab3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc838000000006627eab6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc839000000006627eab9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc83a000000006627eabc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc83b000000006627eabf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc83c000000006627eac2000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc83d000000006627eac6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000003cc83e000000006627eac9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000003cc83f000000006627eacc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "batch_index": 70133, + "message_hashes": { + "1041413": "0x2309c1909b298c03f5b2c4531b75ce924a18f8f01ecd11706c046bf5be121121", + "1041414": "0x5a10e631df8a1843b077d6bfa04157a9e4ebcad949c594bec13fd5fc91987e9a", + "1041415": "0xb01db83451d4edab828943ad9dea86ac05b50d1f6bcedd4a2fde88d6d598d102", + "1041416": "0x6cd3b0b235cd2b5170a37871354a31847ed5caa21320d59fcdbe89d532fcc161", + "1041417": "0xe11ab5fae2c94c6a509afebbdadc0104ef1d560000275a8532b18571e4886e33" + }, + "blob_versioned_hash": "0x0127c42381cb4014aeaa54fcc188be37d9aa9a5aa1e79fd01aaad7dd37c8575d" + } + }"#; + + serde_json::from_str::>>(json).unwrap(); + } +} diff --git a/lib/scroll-codec/Cargo.toml b/lib/scroll-codec/Cargo.toml index 5e4f7b922f..34b03ce54f 100644 --- a/lib/scroll-codec/Cargo.toml +++ b/lib/scroll-codec/Cargo.toml @@ -13,14 +13,14 @@ workspace = true [dependencies] enumorph = { workspace = true } -ethers = { workspace = true, features = ["rustls", "providers"] } -futures = { workspace = true } +ethers = { workspace = true } +futures = { workspace = true, optional = true } hex = { workspace = true } macros = { workspace = true } num-bigint = { workspace = true } serde = { workspace = true, features = ["derive"] } serde-utils = { workspace = true } -serde_json = { workspace = true } +serde_json = { workspace = true, optional = true } sha3 = { workspace = true } thiserror = { workspace = true } unionlabs = { workspace = true, features = ["ethabi"] } @@ -28,5 +28,10 @@ unionlabs = { workspace = true, features = ["ethabi"] } [dev-dependencies] hex-literal = { workspace = true } scroll-api = { workspace = true } +serde_json = { workspace = true } tokio = { workspace = true, features = ["macros", "rt"] } url = "2.5.0" + +[features] +default = ["fetch"] +fetch = ["ethers/rustls", "ethers/providers", "dep:serde_json", "dep:futures"] diff --git a/lib/scroll-codec/src/batch_header.rs b/lib/scroll-codec/src/batch_header.rs index 1f53550658..f7b7f375ca 100644 --- a/lib/scroll-codec/src/batch_header.rs +++ b/lib/scroll-codec/src/batch_header.rs @@ -25,7 +25,12 @@ pub enum BatchHeaderDecodeError { } impl BatchHeader { - pub(crate) fn decode(bz: impl AsRef<[u8]>) -> Result { + /// Decode a batch header (either v0 or v1). + /// + /// # Errors + /// + /// See [`BatchHeaderDecodeError`] for the possible failure modes for this function. + pub fn decode(bz: impl AsRef<[u8]>) -> Result { match bz.as_ref().first() { Some(&BatchHeaderV0::VERSION) => Ok(BatchHeaderV0::decode(bz)?.into()), Some(&BatchHeaderV1::VERSION) => Ok(BatchHeaderV1::decode(bz)?.into()), diff --git a/lib/scroll-codec/src/chunk.rs b/lib/scroll-codec/src/chunk.rs index 7b9d686f28..48808ae426 100644 --- a/lib/scroll-codec/src/chunk.rs +++ b/lib/scroll-codec/src/chunk.rs @@ -36,7 +36,13 @@ pub enum ChunkV0DecodeError { } impl ChunkV0 { - pub(crate) fn decode(bz: impl AsRef<[u8]>) -> Result { + /// Decode a v0 chunk. + /// + /// # Errors + /// + /// See [`ChunkV0DecodeError`] for the possible failure modes for this function. + #[allow(clippy::missing_panics_doc)] // panic is unreachable + pub fn decode(bz: impl AsRef<[u8]>) -> Result { let bz = bz.as_ref(); let len: usize = bz @@ -60,7 +66,7 @@ impl ChunkV0 { blocks.push(BlockContext::decode( bz[((BlockContext::LENGTH * i) + 1)..=(BlockContext::LENGTH * (i + 1))] .try_into() - .unwrap(), + .expect("size is the expected length; qed;"), )); } @@ -115,8 +121,13 @@ pub struct ChunkV1 { } impl ChunkV1 { - #[allow(clippy::unwrap_used, clippy::missing_panics_doc)] - pub(crate) fn decode(bz: impl AsRef<[u8]>) -> Result { + /// Decode a v1 chunk. + /// + /// # Errors + /// + /// See [`ChunkV1DecodeError`] for the possible failure modes for this function. + #[allow(clippy::missing_panics_doc)] // panic is unreachable + pub fn decode(bz: impl AsRef<[u8]>) -> Result { let bz = bz.as_ref(); let len: usize = bz @@ -137,7 +148,9 @@ impl ChunkV1 { for i in 0..len { blocks.push(BlockContext::decode( - bz[((60 * i) + 1)..=(60 * (i + 1))].try_into().unwrap(), + bz[((BlockContext::LENGTH * i) + 1)..=(BlockContext::LENGTH * (i + 1))] + .try_into() + .expect("size is the expected length; qed;"), )); } diff --git a/lib/scroll-codec/src/lib.rs b/lib/scroll-codec/src/lib.rs index 5fab80d57d..b633d260bb 100644 --- a/lib/scroll-codec/src/lib.rs +++ b/lib/scroll-codec/src/lib.rs @@ -4,18 +4,20 @@ //! Scroll types, as specified in , with the commit from [this announcement](https://scroll.io/blog/blobs-are-here-scrolls-bernoulli-upgrade). -use std::{collections::BTreeMap, ops::Add}; +use std::collections::BTreeMap; -use ethers::{ - providers::{Http, Provider, ProviderError}, - utils::keccak256, -}; -use futures::{StreamExt, TryStreamExt}; +use ethers::utils::keccak256; use num_bigint::BigUint; use serde::{Deserialize, Serialize}; -use serde_json::json; use sha3::{digest::FixedOutput, Digest, Keccak256}; use unionlabs::{hash::H256, uint::U256}; +#[cfg(feature = "fetch")] +use { + ethers::providers::{JsonRpcClient, Provider, ProviderError}, + futures::{StreamExt, TryStreamExt}, + serde_json::json, + std::ops::Add, +}; use crate::{ batch_header::{BatchHeader, BatchHeaderDecodeError, BatchHeaderV0, BatchHeaderV1}, @@ -212,6 +214,7 @@ fn commit_chunk_v0( H256(hasher.finalize_fixed().into()) } + /// fn commit_chunks_v1( total_l1_messages_popped_overall: &mut u64, @@ -219,9 +222,9 @@ fn commit_chunks_v1( skipped_l1_message_bitmap: &BigUint, message_queue: &mut BTreeMap, ) -> (H256, u64) { - let mut total_l1_messages_popped_in_batch = 0; + let mut hasher = Keccak256::new(); - let mut batch_data = vec![]; + let mut total_l1_messages_popped_in_batch = 0; for chunk in chunks { let chunk_data_hash = commit_chunk_v1( @@ -232,13 +235,11 @@ fn commit_chunks_v1( message_queue, ); - batch_data.push(chunk_data_hash); + hasher.update(chunk_data_hash); } ( - H256(keccak256( - batch_data.into_iter().flat_map(|x| x.0).collect::>(), - )), + hasher.finalize_fixed().into(), total_l1_messages_popped_in_batch, ) } @@ -251,17 +252,11 @@ fn commit_chunk_v1( skipped_l1_message_bitmap: &BigUint, message_queue: &mut BTreeMap, ) -> H256 { - let block_contexts = chunk.blocks.iter().flat_map(|bc| { - [ - bc.block_number.to_be_bytes().to_vec(), - bc.timestamp.to_be_bytes().to_vec(), - bc.base_fee.to_be_bytes().to_vec(), - bc.gas_limit.to_be_bytes().to_vec(), - bc.num_transactions.to_be_bytes().to_vec(), - ] - }); - - let mut concatenated_tx_hashes = vec![]; + let mut hasher = Keccak256::new(); + + for block_context in &chunk.blocks { + block_context.copy_block_context(&mut hasher); + } // TODO: This can be a scan for bc in &chunk.blocks { @@ -273,15 +268,10 @@ fn commit_chunk_v1( message_queue, ); - concatenated_tx_hashes.push(concatenated_l1_hashes); + hasher.update(concatenated_l1_hashes); } - H256(keccak256( - block_contexts - .chain(concatenated_tx_hashes) - .flatten() - .collect::>(), - )) + H256(hasher.finalize_fixed().into()) } /// @@ -322,8 +312,9 @@ fn load_l1_message_hashes( /// See [`FetchL1MessageHashesError`] for possible failure modes for this function. /// /// -pub async fn fetch_l1_message_hashes( - provider: &Provider, +#[cfg(feature = "fetch")] +pub async fn fetch_l1_message_hashes( + provider: &Provider

, height: u64, call: CommitBatchCall, ) -> Result, FetchL1MessageHashesError> { @@ -391,6 +382,7 @@ pub async fn fetch_l1_message_hashes( .await } +#[cfg(feature = "fetch")] #[derive(Debug, thiserror::Error)] pub enum FetchL1MessageHashesError { #[error("error decoding parent batch header")] diff --git a/lib/scroll-verifier/Cargo.toml b/lib/scroll-verifier/Cargo.toml index b13b94ab1c..7facea0bf4 100644 --- a/lib/scroll-verifier/Cargo.toml +++ b/lib/scroll-verifier/Cargo.toml @@ -12,13 +12,16 @@ workspace = true test-include = ["lib/scroll-verifier/tests"] [dependencies] -ethereum-verifier = { workspace = true } -hex = { workspace = true } -rlp = { workspace = true } -serde = { workspace = true } -serde-utils = { workspace = true } -serde_json = { workspace = true } -sha3 = { workspace = true } -thiserror = { workspace = true } -unionlabs = { workspace = true } -zktrie = { workspace = true } +ethereum-verifier = { workspace = true } +ethers-core.workspace = true +hex = { workspace = true } +hex-literal.workspace = true +rlp = { workspace = true } +scroll-codec.workspace = true +serde = { workspace = true } +serde-utils = { workspace = true } +serde_json = { workspace = true } +sha3 = { workspace = true } +thiserror = { workspace = true } +unionlabs = { workspace = true } +zktrie = { workspace = true } diff --git a/lib/scroll-verifier/src/verify.rs b/lib/scroll-verifier/src/verify.rs index 76dc84b10c..7a471244b5 100644 --- a/lib/scroll-verifier/src/verify.rs +++ b/lib/scroll-verifier/src/verify.rs @@ -4,6 +4,8 @@ use ethereum_verifier::{ verify_account_storage_root, verify_storage_proof, VerifyAccountStorageRootError, VerifyStorageProofError, }; +use ethers_core::abi::{AbiDecode, AbiError}; +use scroll_codec::CommitBatchError; use sha3::Digest; use unionlabs::{ hash::{H160, H256}, @@ -13,7 +15,7 @@ use unionlabs::{ }; use zktrie::{decode_smt_proofs, Byte32, Database, Hash, MemDB, PoseidonHash, TrieData, ZkTrie}; -#[derive(thiserror::Error, Debug, PartialEq)] +#[derive(thiserror::Error, Debug)] pub enum Error { #[error("{0}")] InvalidContractAddressProof(#[from] VerifyAccountStorageRootError), @@ -23,59 +25,79 @@ pub enum Error { ZkTrie(zktrie::Error), #[error("node value mismatch")] ValueMismatch, + #[error("unable to decode commit batch calldata")] + CommitBatchCallDecode(#[from] AbiError), + #[error("error while calculating batch hash")] + CommitBatch(#[from] CommitBatchError), } pub fn verify_header( - scroll_client_state: ClientState, - scroll_header: Header, + client_state: ClientState, + header: Header, l1_state_root: H256, ) -> Result<(), Error> { // Verify that the rollup account root is part of the L1 root verify_account_storage_root( l1_state_root, - &scroll_client_state.rollup_contract_address, - &scroll_header.l1_account_proof.proof, - &scroll_header.l1_account_proof.storage_root, + &client_state.rollup_contract_address, + &header.l1_account_proof.proof, + &header.l1_account_proof.storage_root, )?; // Verify that the latest batch index is part of the rollup account root verify_storage_proof( - scroll_header.l1_account_proof.storage_root, - scroll_client_state.latest_batch_index_slot, - &rlp::encode(&scroll_header.last_batch_index), - &scroll_header.last_batch_index_proof.proofs[0].proof, + header.l1_account_proof.storage_root, + client_state.latest_batch_index_slot, + &rlp::encode(&header.last_batch_index), + &header.last_batch_index_proof.proofs[0].proof, )?; // Verify that the rollup finalized state root is part of the rollup account root verify_storage_proof( - scroll_header.l1_account_proof.storage_root, - finalized_state_root_key( - scroll_client_state.rollup_finalized_state_roots_slot, - scroll_header.last_batch_index.into(), + header.l1_account_proof.storage_root, + batch_index_mapping_key( + client_state.rollup_finalized_state_roots_slot, + header.last_batch_index.into(), ), - &rlp::encode(&scroll_header.l2_state_root), - &scroll_header.l2_state_proof.proofs[0].proof, + &rlp::encode(&header.l2_state_root), + &header.l2_state_proof.proofs[0].proof, + )?; + + let batch_hash = scroll_codec::commit_batch( + ::decode(header.commit_batch_calldata)?, + header.blob_versioned_hash, + header.l1_message_hashes, + )?; + + // Verify that the batch hash is part of the rollup account root + verify_storage_proof( + header.l1_account_proof.storage_root, + batch_index_mapping_key( + client_state.rollup_committed_batches_slot, + header.last_batch_index.into(), + ), + &rlp::encode(&batch_hash), + &header.batch_hash_proof.proofs[0].proof, )?; // Verify that the ibc account root is part of the rollup root scroll_verify_zktrie_account_storage_root( - scroll_header.l2_state_root, - &scroll_client_state.ibc_contract_address, - &scroll_header.l2_ibc_account_proof.proof, - &scroll_header.l2_ibc_account_proof.storage_root, + header.l2_state_root, + &client_state.ibc_contract_address, + &header.l2_ibc_account_proof.proof, + &header.l2_ibc_account_proof.storage_root, )?; Ok(()) } -pub fn finalized_state_root_key(slot: U256, batch_index: U256) -> U256 { +/// Storage slot of a `mapping(uint256 => bytes32)` mapping, where the mapping is at slot `slot` and the `uint256` is the `batch_index`. +pub fn batch_index_mapping_key(slot: U256, batch_index: U256) -> U256 { U256::from_be_bytes( - H256::from( - sha3::Keccak256::new() - .chain_update(batch_index.to_be_bytes()) - .chain_update(slot.to_be_bytes()) - .finalize(), - ) - .0, + sha3::Keccak256::new() + .chain_update(batch_index.to_be_bytes()) + .chain_update(slot.to_be_bytes()) + .finalize() + .into(), ) } @@ -139,15 +161,14 @@ pub fn scroll_verify_zktrie_account_storage_root( #[cfg(test)] mod tests { - use std::str::FromStr; - + use hex_literal::hex; use unionlabs::{ hash::{H160, H256}, ibc::{ core::client::height::Height, lightclients::{ - ethereum::{self, proof::Proof}, - scroll::{self, client_state::ClientState, header::Header}, + ethereum::proof::Proof, + scroll::{client_state::ClientState, header::Header}, }, }, }; @@ -155,31 +176,34 @@ mod tests { use crate::{verify_header, verify_zktrie_storage_absence, verify_zktrie_storage_proof}; #[test] - #[ignore = "testdata is invalid"] fn test_update_header() { let scroll_client_state = ClientState { - l1_client_id: "08-wasm-0".into(), + l1_client_id: "cometbls-1".to_string(), chain_id: 534351.into(), - latest_batch_index: 65031, + latest_batch_index: 65327, latest_batch_index_slot: 156.into(), - frozen_height: Height::default(), - rollup_contract_address: H160::from_str("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0") - .unwrap(), + frozen_height: Height { + revision_number: 0, + revision_height: 0, + }, + rollup_contract_address: H160(hex!("2d567ece699eabe5afcd141edb7a4f2d0d6ce8a0")), rollup_finalized_state_roots_slot: 158.into(), - ibc_contract_address: H160::from_str("0xE52c957533bd932E357046bF721D2Bf2368ef1B7") - .unwrap(), + rollup_committed_batches_slot: 157.into(), + ibc_contract_address: H160(hex!("0000000000000000000000000000000000000000")), ibc_commitment_slot: 0.into(), }; let scroll_header: Header = serde_json::from_str(&std::fs::read_to_string("tests/scroll_header.json").unwrap()) .unwrap(); - let l1_state_root = - H256::from_str("0x4d47173201f8ded2c250d7f7f572a22d13061ed83009f451d271e0fabfa44425") - .unwrap(); - assert_eq!( + + let l1_state_root = H256(hex!( + "4d47173201f8ded2c250d7f7f572a22d13061ed83009f451d271e0fabfa44425" + )); + + assert!(matches!( verify_header(scroll_client_state, scroll_header, l1_state_root), Ok(()) - ); + )); } #[test] @@ -187,19 +211,17 @@ mod tests { let proof: Proof = serde_json::from_str(&std::fs::read_to_string("tests/scroll_proof.json").unwrap()) .unwrap(); - assert_eq!( + assert!(matches!( verify_zktrie_storage_proof( - H256::try_from( - hex::decode("1b52888cae05bdba27f8470293a7d2bc3b9a9c822d96affe05ef243e0dfd44a0") - .unwrap() - ) - .unwrap(), + H256(hex!( + "1b52888cae05bdba27f8470293a7d2bc3b9a9c822d96affe05ef243e0dfd44a0" + )), proof.key.to_be_bytes().into(), &proof.value.to_be_bytes(), &proof.proof ), Ok(()) - ) + )) } #[test] @@ -207,147 +229,15 @@ mod tests { let proof: Proof = serde_json::from_str(&std::fs::read_to_string("tests/scroll_absent.json").unwrap()) .unwrap(); - assert_eq!( + assert!(matches!( verify_zktrie_storage_absence( - H256::try_from( - hex::decode("1b52888cae05bdba27f8470293a7d2bc3b9a9c822d96affe05ef243e0dfd44a0") - .unwrap() - ) - .unwrap(), + H256(hex!( + "1b52888cae05bdba27f8470293a7d2bc3b9a9c822d96affe05ef243e0dfd44a0" + )), proof.key.to_be_bytes().into(), &proof.proof ), Ok(()) - ) - } - - #[test] - fn broken() { - let header_json = serde_json::json!({ - "l1_height": { - "revision_number": 0, - "revision_height": 4637995 - }, - "l1_account_proof": { - "storage_root": "0xc38eb6a242688def560307e353f47ce03c64bee1efda8e80d5a494876204bbd8", - "proof": [ - "0xf90211a0a58f66ec49f830a7b6111aa74c875549ef1b0c3f0cfab25bd0c633ed127626cea0ab4c165428957894c458f0e79880a4704233b5ff113d877629512608520e2f7ea035a64d456485de695cf7c6fc5c0244527cd74c7e242dbe2ca13a36c48796731ca01c0a4f070e905fe5c73f072d022df23fcd600f1e381cfa23e6ce41addb5b0db7a05c7c45d7422c7eb43316397ab93cb10cb429abfb7adb3b48717a0983b9490050a02e3b64df22910e32402f6f2c89cb6a66d4caf7f3deb2844e5d8087a28df9a7bea0448a76ac44a8cbbc929b667191835bbc4ca2e17a92027ab9dc0e4d1b303a6ebda062c544b06a6a48c2c41e8a2a063d0cbb87eef945073973c7095df56b4edf2ca6a09cf0e4ec8aa155348bfcafd32d5631f04a3c57b89e2a4ad30fc0ed39d4bb8634a01f7581f4d35abe7bdc246a2b84ceb3abe6c36cf83e70ce64e6a184c0ec43d10ba00c807d0f42ba8bad4ff1f38ea805ecc6179b8db52e13295ada4c59abbba25e4ca0e5dde40287737f975529e61bd32006f8bb998752df2e0b5c451a18206e0260a0a094dcb584a453d13d4dbe37c560d66ffd72196cd844e04457e7616b9e216ddc92a043c2bd0b8c9e7a3a690ab549d6f2591251673c2100e2e387fdc8e5f59154359ba01f7bd3938154feff1c0db7c6ea83ef548d695f7961147aabb956d54ecbb5dfb7a03dc231066e5c4e41f1d7c27e817e01a05cb2c2425f9f795dde2a4c3db97081b980", - "0xf90211a04100bbb62aa7fcb52b1e283421daa4d5b914588b0c384763153072a7b81fedf9a031c21e66bd86ca3fd55b00bdb7abbdea62a121b30b6c53dd65c76295af6fcf56a08155835933c3bf098b0546fafb67b9dc042a5d467306de31fb565115c9c7ae35a0f281f8caf361a2930d06f634142ba19efb841ee693ef08de77f8af4bed9fb795a094c840808cb93faf504c43de097c577c254c5d7298893c84c9838c006367800da01b0e6e86ec8add91a8b7e3e664ed132e45c4d11b85e4c027ca023728b9941656a01aa70dfd4789cf3b7def6a2915e5b121bc65fea68e695f60b66721096d67e3dda02dc77bcab57e005eaad658e24ea68a7064634cc1185680082b3c1666ba691cf4a0c08bb855eff68e28515ec2d8fca67f423ab0bb53ac7fddfffd36de3cdacc1814a02ffd8d6a46c63d180b4db23ea0f1f6a1e2422109c89c947f24108688b447ac24a04a77fd79d9c28a365da7081464f8603009bbbc79cf64c59e2679d8b8a40fd2eca0bd80f34bc973f7f153e9b76dcfd1cf60396a5189d7b3f98f1cffa53e7cc098dea09382182ff667108203fad6751e9f08c9d78b48ba058d679205de936c4ca62eaaa04ae61a7a196a3835af5193bafd34b9655041f867fcf0cbd75497503e0aa12907a0f04426caaa099498de4888ec8f5c58a4866eabd713c15ee3e443b01c8f5edf77a0de10bb131951794b77b9908619e07828ae0d59ccdea229e644b499328b1aa88b80", - "0xf90211a0671341e4406640305c02d1bced9422611d549da92b43b1bb34c1c834b830a814a0657a0639957191474ab2624cd0d2221237bb7d87f1525fdcc80b80db080a4fd5a04001cb5dc153d7c16c0d4247f5a4673abdfd75c3c93cb9aded2ff23291e95e82a0e100bd37f99a68d3431d4a2d42e2b640b1565ea1529e1b99fe51e233eb818dbea0244a05127d0948280ea87ae202fa12ab33757a6c19013b01f8e72b4f8f540c2aa021b40d81d948854c35f8511f4cd61ba0c92322ac21dab7c266e0a2e6af4ced8fa08d3da57dfeb682bcf4156c5f6aeb07dda1df9f5e376299946dcba4ef3f3b6d78a0716c541f8f3dc04ad244abdce6724b894a2143951684c3cbb49cbbb37a6b3efca011923db60fa8b86979a5b71882e17544cb2a2e803c398e6809ff50c91a46d481a01c7554aef4992df1a456781effc1192af4f857d1e4d18d490f5735aa9a04ee1ba01c7672ff5029ba2e31b025b475283f8fabceec30f9b9f08b2d5f73d213334876a045cffbc5010d4927e9ec2b5a6362fcb447ca3b08ac6f56f27a2fe9c170505168a090ca1c577065acb4477de8829b1c5e883f9f2554382d3d5c1725a51c7000970ca033bbb72a15b3de529f15a18f7c0d637470f7ac83bb5ebbb37ddb782be53c0b19a0bfc09176b802af0aebbcd49408e8876ad724f7f3130c9e74ffc8947185aef864a027b160cd3c50d6e705d7adf747c372e7328537252a6f4fc67a78830b50a4097580", - "0xf90211a044b47a242f6c7ed0f5fa23241206e72b73a5821283b188d3b54caf33e247c20fa0f9e7e18d22d625bfc207558d29a23c63227ad907d3a1070b11519da94069a69fa0b2926f8be8cb2c53e76e44520800f861d82362c4c106a2bf220ddc74686c34cda0ecad0f2c551058bedcbd614cd0040092419d1f5d1d658d5e9fbee34bed71ce07a06e182319bbf519930f2acd75dacac37ee427893093c2b53c1590c9a62c9d2abea0d7e16b671886dfaccd74163e3773786a7c18a95c2c20e3029e341f5b335b6f58a0d533e639cbba4fdcfe455814666a072f991d6e9f11b31f5b034698fc5abd1ad2a06a5bcf85bd108decd392bcc774c26a53e40b1fc82c4c8cf9a61f2daf65c671dea00abaae9008bf9d360b7347330a83e581345b525e2cb3e8fbf02dad2ffff977a8a04d3b7cc55cdfcde9978a7fb10755e012fb02eecd73c13621e03a13ce66bbbf39a050464dddab79d00549e827c1b3c3a31b5634155934afba80fa5fdce37f6dde74a06cfd88a2b17fd7f201f4f2ab26098c6b651db5c674b48ea4246b2f3c413f54fda038b5797ee479fc2efb7ae7972ff9ed0a3852ecf81accf2f271022220b36216bba064f094d02e0fc581e4f2ca6e7d4096bffee4d930d779de8f69f81115123d90eaa0499b30344021c1ed22f8acb7b38814bd5d39dae9d32361cbae7d791eac4a6b3aa0536f596a3422bad4087ccfd98f0ab94a9cf4ac10ea7ded41f91d9a04022e379f80", - "0xf90211a0846ed4027f4ec434d67b345599f4a06758ae1f9cce10c7295b06da89d3fcdea5a0dbc19ceab12e962c61bb51e65ef2a0aa3069983321629345056a582646d903aba0e93a7f3d109585740a1602c2fa366f9b57830771bb55309b291934d8ec34844da096fb77310a4ad476757b7c18a8ad9dfb58d4675873a6464b45a548d559889558a0646cc8cb10356f9290378ea7d183f29b9a6561addf2619f1ba922085c196e8eaa03e20e096bc45fecc4b1334ff7e2c7644f105451cb57ac0b052e7673af8b06505a00c6d289344ccccd31825ecc729fd89f762897ffbb1d038646c00a21faf087145a06397f2bf58c0ed43617044141b704c991f43adb2d971c6ed60b05f16d11a8913a02f33fa3a08071bc44d9cf173318932eff2b63170c2451ec5d031d52413a6676ea0d97f601dfdf7f8145d442f6ce99b0c57cc672fc99a883283f16634e995dc7e2da0208c8d9781bc3b437cae67352f8090f3b186ea98dc51f02b6c633d895cd25f69a0c173cf79089c1da18342f6e300f039f32a0f17034f063a8a71fd9198939c5ae6a0aa762991e48bb6f9889aebd601a26a4727365ac90f20a3be8c4b1f7cf4e1fd62a023e464bb3e6fd240ccaa89f89ac6605aa897fc38731b6534c883d7754ba42b32a0d95800c528bd89e04faf83b88004120df87f736909a572ed7c9500980a06c0c0a067ea0131b01019c09cbf242de8adde4c340dd03ef45a3ad92e17399bba124bc080", - "0xf901d1a066d423d34e5a9b16cb92a7b2cdf53f05ab66d3f18aeb38d365777649d13208bba0ef8bd9c5041c37d210b732b513b2fd218ce38526db918ba35089364409b8aabba0130f2594c868ebd78c401c6618a7d602d80e0197d5129ee07d0bef880059a9b5a0afcd23ba8fe2f7c882188bd4a5a8cb7ce87299736495d309b90d92ff87b8aff6a0cd6ba81a6514383d48a5462a7a5367178ef1ad8c9edcbb1377f30522709ea771a0cc1e2bf25de83822d1391886be1e93256be68c6123f19df2c2e38a3f3377016ea096ee188171d9b276721f98abcab6488d7b65c563af3803627dd1c405e1706dd6a0567d9b4478d01a0be34653015dc55f113bcefab5827314ae7a76f04df7facfd4a063855a2ef44156d7e415e7aca2dff91e73eb882388012b2b943126b715ff46fb80a0acfe458fff6a2edadb8cb326cd29ea15f4dc992b4df67d15668f7f5e9859922ca0ca477a6f6494f2973d7aebf600e47061ba702fa28469272cdd48df9f38416a46a09d8fcb47e73f0ec91b70e7d1d25ea8b832f538848079e2df60be7fdfc5978a1e80a010d68c307a7c7227437c9271d90fce3494319650d78bce7a6f35847880cb5e9ba05edcf0a5cde11abb08c394c81d1e78d8063809f806b551c1f2e4a7910c5013a980", - "0xf871a098dff7457df691287379f14f3c86c17181a01e98865801c1faeea0752e6113cfa05825c5dadaec2cbc329e20866073b32e850c67627d0a46f8ecb568605edaa72580808080808080a0e8f258feb499fb1af8dd8a29aff43cc5209eda6512cff9c38705bdf3281a799980808080808080", - "0xf8669d30f80e30c43f7af65d01662a3164f088eb29e38f1a3a3295a28878b474b846f8440180a0c38eb6a242688def560307e353f47ce03c64bee1efda8e80d5a494876204bbd8a023c736713c762f5d684fdda5244e49dc182aa801b78383ddf51015c1597c446c" - ] - }, - "l2_state_root": "0x10a74cabfb7b7ff657a6a5ab27692a2d370b89f6a51f5ce2c3fd4b90431ca970", - "l2_state_proof": { - "proofs": [ - { - "key": "0x0aa575884ef0b2ca545005ea8b6057ce8aff1fb494f9f50527d9d089c4839f6b", - "value": "0x10a74cabfb7b7ff657a6a5ab27692a2d370b89f6a51f5ce2c3fd4b90431ca970", - "proof": [ - "0xf90211a0e50f29460845868e76db2a31104bfd4009b3643a2104a95b1c44eecc871ee24fa0a7884441ba95efa151846084d77c40fb865ef316978fcc7a77a567fb0ba53e8da077150ea6a10606b4a284ca1af35a053ed8e022ad22749cf30db5311ff0ec321ba0cfa4f12ac7d9a091048b313c65a8912f4a570ee703dea65f2e1ebac55cce0b85a08387f7891bb7f0b914ba011be65f24432f13c5bd36d3802ef06d062426093e6ea0f3cc2a253a5aa53b1ccbf7698049edca4590a63927f01c31954548605550c85fa0a92399f12680ffcb7e6bc3c7f3d60af0f881f22f3901254f5bbb7cee1b819612a0e8316848ca848eb98dfb47e030dd94585c59286a9aff17fd6b5f2114dba23196a029822aae9a5f771daa7a05c9c7853ad172494cdfd3b30893077486fb5f48af16a07eb7eb115205f9480c782d9d1abe4972fd85f042aae59272e8fde95ccc7c4890a07ca9696dd5c47181917e2e116ea6333256dee1c264728c1ffb47f73b3188135aa017b46380c5ecc3648fdd20c3716ccafd3dff66629a0441a950d4d95243b37570a0a8b02537727067aa2b853d591be12e27177f2ce3d56ffe8bc00f7095781daaa3a07d4c3be6eb1045169edd0843200567956eec5fe21959b3071aaa8bda8ea6dc6fa05911db50054d2c174dff5f65d18ba9b83374893ded6fced273d8e6a7c6fba35ca0fe95d78e6c5f28c1698ea7c1260bd0bd1bb39d6bdd3513f45347d7a46c8cfe5d80", - "0xf90211a0bdc0410b5430c81975909457ea3fdf32618e4926195251798abf35033f0ee9aba0513d5529ec80e8e3613ef7ea2369b8b3134585f43452a762278638e57bf39661a0227fb36cf39ee30e8b96a502386c360859fd7f0065dc6fc75d6f9716e6e798b1a0ffad91dcdf3553a29783db41600cba1b4d6ea9af18522048cfd657b9b6ea3dafa0af5ad9a8848f8a4ddf748747abe9c888bda4f0b02c27f6ee472343d0d4f58a07a0a6841b48aa94557c3fce246ed78b11181c30f1cc8e2254e0cc5adb4437d902bda00beeab463a615cd8689a13fcba696a676cabb4a1a723ea26d4d7e5f9117b0324a0807b0b8fdf4e4d8600329bdf4793196f2dc226567dc0099cfb3ab7ebe5db9aa0a0b33fc6db738dc82b5330119d1f0106e2fe3c8327991471354a24524f8abfc87ba0cdaadac94f69f5cf4c9ca3ad050baa2072243ad7464fc8cbc463358cc22efb40a0ea4be36b4f6b4bf9a3d406c74991d2ec77022adc8989a26d9286bfd5e7f90aa8a0aec6f0a803872bb3f94afd49a50afbac6220ff4f61f7d1355edb4dbc8ac6821ca003f83722a53fad443d36ba4f30d7b8cfe9c886d2ac411f76cef10174dd404c8ca05b65e68e13cac46b52b583b2e7dc7bb1aa1ebaa658860b43327029b9e1bdf3d3a084058fa7c7187256bbd1c0f3bc4395655e9a57fc259f01821677f4955e69b246a073b1e9ca822bbda47ec36fc7d4d520d6f39872ecd69f39c63579939cd581a98f80", - "0xf90211a015f2d444750c098623946f0706fd614583c8fecd14dbbede1a12583f3637cce5a0c7bacafe8672b306973a89be420ba3d4e0ab6cd1328769a561097fb5bc368f38a07ab2969699848a6be874d5853fbf12939e3ef53ab2a2b4a94f5c28a6ceda8f9ca0135842fe349e8131e101890b19b62322e7b6ee1966ecd48a2e5a587b0b8572a0a02499737a49eb3a4387c586c37407f3d8557a780ced5dfb660404b53dd5086b36a0ec3ff96b5388e981a5f051bbd1d4ae2f40c9aee0a9c7348351c1714d024fded7a06d6a5e50a1a164c6c96e864a7f69b93249accd2a692acc71735aeb75fcd7eed9a002ece77be62ccfb77c1e1234eef28c96cd2443ae062d1bdaa477ccfbd190b735a0b9d957d4e7165127e5865456d157b0b162b68171ab616f2c36bd01c53a3923dfa09d83d8839bb9ea71d1d9fae21bb3446021b1f06014950063042ccadd5845bd3ba0b9e03dacd9e881f21bef76d3de3d5970b1f181eb4b8e0fb9b12fe8666c9e533fa0420005111d256b72f468b57ba1e383842ba3c6122e79d164daf8db40736bc2d3a07184133b5150a0986169c720a5c445193e00c3c2ed823257590a7741bbcab2c4a054f927670e6d83e0b7962d3e647f71430cebca9bb1607655ad7d033c7f7fe52ca0b1bf5ef6c680524e86760bd237bd7c4a78e3aa1eb3b8379c081865b72204d0faa0692bb14742a53b81094178c5d4564a79b913b72ee3d3fbf33b6bbf9d8dfafb0b80", - "0xf90211a0f62f3a3bba41178433ff8e881694c01ed5b4e611280b31cfcc05b63c7365552fa04e4a9eb6d8cf7df5f11705b560a9bf735c78c057343d57fe60da34fd6e9ab6f4a0d5dd50d55c6d229cd14f6c081f394910a3aab29ad152c9605b751fc16ac73eaba027b08ba949652c33d82a018d16eb8fc4b9a772f1edc6046f899d4ad03ae992d0a08e8a9f4ed5fe027ef33c8317e350c48f726824af27c819196885369fe2d8a9d1a053636fc736b5459c3ff26154144698b6c1ee6a571e9133ecfe29c360da6f55eba0c10846eb2ef85e81382f1c2658ebbf79c85633343e24ace7d7dc02048089a196a079e30eff818849aee8fbd5876a3a0e24cb236087423f5e1035a775653c253192a021e978ee53fb44a0b163a627f89cd340d3bcf52ddf6ce3c6a71dc75fad80e2b9a042129463343fcf7f3b97df0f0ac0012a463ee4d36e67d30fd4222d9e30fd021ba0da44a9b5fd878182364b7a148b3b2ba22da2541115a0f5e88cdca93a56a5e2d3a0edaf9db13ff1cc0a86872f794123873ed971da6aa6c231c0d95fc214c286da20a048e7060ecb3088f830f860f354361174c21993b9737aebfac77a626cbfdbd8a0a01b13db87f563053d987eacae70da31323962b13805a912e9b8e992a16b421c3ea03822a3b0c09dadf62f114dc86adb6186c9b3dca6e5f5e82c1d2a1ab913e8d564a016b7610a20dfc4b4f4b3d53d67b192e4288d73e4da8f98f111682c09fd2f1d9080", - "0xf871808080a034e32e474e004303e0de51acd3b45c73a86e7b690b7292ef4701fda6f5e171e2808080a00aa102899d3d9b3617b22f34275d8cdb99ce8736f9843f6c6321b49e8416ae6c80808080808080a0454cb251e2e9bdaa18d8c42b56347ae4da83c4c99de2b6715ef9853229150d6580", - "0xf8419e3c8a5800ca2fc884386f6f2f1840770425ee28de0bdecee827a6724b05baa1a010a74cabfb7b7ff657a6a5ab27692a2d370b89f6a51f5ce2c3fd4b90431ca970" - ] - } - ] - }, - "last_batch_index": 68318, - "last_batch_index_proof": { - "proofs": [ - { - "key": "0x000000000000000000000000000000000000000000000000000000000000009c", - "value": "0x0000000000000000000000000000000000000000000000000000000000010ade", - "proof": [ - "0xf90211a0e50f29460845868e76db2a31104bfd4009b3643a2104a95b1c44eecc871ee24fa0a7884441ba95efa151846084d77c40fb865ef316978fcc7a77a567fb0ba53e8da077150ea6a10606b4a284ca1af35a053ed8e022ad22749cf30db5311ff0ec321ba0cfa4f12ac7d9a091048b313c65a8912f4a570ee703dea65f2e1ebac55cce0b85a08387f7891bb7f0b914ba011be65f24432f13c5bd36d3802ef06d062426093e6ea0f3cc2a253a5aa53b1ccbf7698049edca4590a63927f01c31954548605550c85fa0a92399f12680ffcb7e6bc3c7f3d60af0f881f22f3901254f5bbb7cee1b819612a0e8316848ca848eb98dfb47e030dd94585c59286a9aff17fd6b5f2114dba23196a029822aae9a5f771daa7a05c9c7853ad172494cdfd3b30893077486fb5f48af16a07eb7eb115205f9480c782d9d1abe4972fd85f042aae59272e8fde95ccc7c4890a07ca9696dd5c47181917e2e116ea6333256dee1c264728c1ffb47f73b3188135aa017b46380c5ecc3648fdd20c3716ccafd3dff66629a0441a950d4d95243b37570a0a8b02537727067aa2b853d591be12e27177f2ce3d56ffe8bc00f7095781daaa3a07d4c3be6eb1045169edd0843200567956eec5fe21959b3071aaa8bda8ea6dc6fa05911db50054d2c174dff5f65d18ba9b83374893ded6fced273d8e6a7c6fba35ca0fe95d78e6c5f28c1698ea7c1260bd0bd1bb39d6bdd3513f45347d7a46c8cfe5d80", - "0xf90211a0117af500abbb7ee05c7d02d14b4d368dadf63e3aaf0a6679c83f2978d603bea4a04769a4923a16ad6e06af1317cfeae5f484940fa6f761c8877848c38d4840adada0222c01af482d1545188b2fc59e893255446be8fa1b99e0a29d8f30ab53b4a7b2a0cdb8202f52643ecea6c1c7fcda93bf12b3c71dd066e3983b2b461ff9f586e9dfa0a03678fd974cf75a62728ff7bddefb6207e48ce71ebbbf96be4dc669c9fd0484a0bdff08d23176acb4e392475a7d0086c38000b4cea1d45534f0f9929e88e9dac3a0f90e07879270698d02f332b842bae3ed0f66d97808c2d70aa8c870a127394b08a0a8c412c3f622137a71c87d3f959686612495192a8cdbab004a7d51c52db98477a0f3a3116c591f20f9cfef2ff8ed6e470a7679202f6655d9f801807393d3468b71a0644f8dbd5dba161a863db25c33ef5be185e768dae7fa2ce6cacfdc56d6331f52a0f18405c00f3b936b127f3d35bc325458c26201a640628569d36d0bc46b84936ea0b43cfefe430b9ee59be1205cffb437308308a747afba7db9cf48bf18143c9d32a0c9b1423537ff7947ec8fba49a76bb2e86f33bc013b0795e94512fcff354d829ea07ee73a42259ea845c9a1a3e0b6570c1f7cbfe5ec19a8d00d96ea5affcc6f3a76a01f0612abae80a74e7e5636254d778201111bb0443ac96b5647b1944301ede6cfa08ddc2e8bf59cbae859ad218f9f48abd2df242a61aa02b1921b9262b7a213738b80", - "0xf90211a091fcb30501931490fa04e1136b1155a66a3f64a5e672c7ce84f0f0590f0ba8d2a0ab2f37a143d91bd04a402a15bfc9cd46d7b0f3447a2d3038e30c3b0afbb3d4eea0bcf08d72387052e973840262180f6ca47724ddf4424794b84a60ad3f977d8772a0bbb50ada0fb95908d26ef9e53c4d234305b48ee8e5abe5b1c20c0636796b5619a0440da2f6a47bc20d024e95ad9f5217ff9cc1e16bd4529cdb9adf4ded6bab2c64a00b3d1afe2729c8dd9eb505d044120cada4d9f8078cc6c9670daf95b53c5e1ecea0d9921f99c85e2339f1987c6a7ef359809ca3e7e7262d5c7dc7267cbbf5d55b0fa0cc28828888833de95499f3c3a0cb859440806b641e35321ad6f80b463fc9bc0aa0956f05e3914e1f8381678c077959c8cd67c2459b4d37d149ff3235a914cc9f72a0a0a53c0fe312554c85ffdf81ad2fc7478b7a5c673e9f23ab48cc68457c632ea0a08e93e16e98a4de9d34b99a83a5d8b589f86263cb082ef54dd8e4db78fa50db37a04cbdcc8f7ac350c307540db99b0b8a9730b57034b869d3b85394a1a2f2f93d83a0e31862a7c047e2ae7f4764f10f1442ca1ce385b13a564cce09b5e34cf9c451dba079b0473d01bc1e1bb50d7b6d7ec315be20b7bb56ce13b06cafda0bc5e2880dd9a092ce7581471ce38e9b368e7f08e20296ae05ad674c37d024ec1dbd1959efcdf4a0ae818a365f0b6a5bf051d15e76cf53522855514b8770499802b797b60b351f6380", - "0xf90211a09a3c2ec24073de2a6356fe12ff5ff5402a5632ac5d877c4998ddd03ad9f9d993a082fe50db7111be23176def6ada1e0952be361d04f73f09d9d2481dfb1010c3eba0882abfbf12225fc442e1a89de4c560a0f959256255c7f3c1861f0eefc7ef2a94a03c4e6f65f17ab56fdcf908ed3adc800ceb0b876e10b91a511d58ca250d4f826ca0c52a317ea244f426c1afd24db6dc400326510341e83ad040ad87da83215a9777a032ab23536069f7548bc259aed117ac090cad6c5ca56df99e5e2ee20e9489006ea057a44a068321fdfc3bc9e5035116a507729b6ed4d14fbddb14585c5ee2f7e5daa090935c7bf50aaeacd868db04440c21210f4d1f3dddc82dfe4e22c91985c25ca8a0a77894b6ccfa6e524e3a42e820da14edee8dd8c1531038f93448f778fac337a9a0456e980c5f0926f191efa5eb82e8d24243ea8cb07996375677f01029a0c903daa0b033c89299efa1d44e37f7a8ae8882c594ef5c789cff1b0ada90cab2f65e9d3ea034602d86244b1da55b25fa63b912dd78fe2cee4f2539fb46e5130708420a30cea08af45a854a4ff29a43f52ab43f05de265e81663cdac471643698f1e5afa31c30a0e668e4ce7014bc1f2f9c7cae76d218971e886463f1915fc18bbda5f08023bda6a05be22cb81afc07e3038091c5de6d7935521901a649743b0f840b91187ab228a0a0af9953223cdd4bfd048310e585587a099761b6ed4ce64142630125c9bab198d880", - "0xf871a0aa1ea7ff8c84dc737bed63bdccbc0437b588b4b6e2b208a65c7ce1256ae9b8ae80808080808080808080a0a5aa2e381e588edced9537af2af5423d4261d446bfb7816439fb05dc6230d0d8808080a09ee310043956460be2c3e3b1da189b120e7a1c9c24d8892238c71f6ec4e1a50b80", - "0xe49e39071dfafeac1409d3f1d19bafc9bc7c37974cde8df0ee6168f0086e539c8483010ade" - ] - } - ] - }, - "l2_ibc_account_proof": { - "storage_root": "0x146bb7b1a9bbba737c173d6bf1d607baf54d160e56f0777be635813ce4b6e9e6", - "proof": [ - "0x090dca03abff6ca0c8924902680f71885fa30de6e761ed5fde49c3ef1254e09d7b255c7c9353bf9936b4d4bb25b7b26a0db9ed69d8ac1421272b6737be0bb24c1e", - "0x092119497b0a5fc0685fea0ca88bc91a70a68ed2db6c752baed60b9bd19ffd08a5103af1bdb62a2cce98fdeba2236b195559f8a84df6527f8bd0da2e2bba2b71ca", - "0x091979b50fb630539d408b29df99dad8d0139703510e3b4c575131253aef1528d703b062db638891d8503b9452da2af15c08af87e991c068cf399bb7ea62376c69", - "0x090bda5d5734fcb02e6b617ca23892c00ef27b3be021186005564db216e9cad73408f51240c5d31d6798d95959fc85bdac18252784d0ad4c6c40bd351752432cd5", - "0x090f8cbb64e596cecd53a2c839ac4ad9b8b6fe7977938d75c26a60165b1fd4b0c603ae65be43de30d8af634e263d3b9d14df2502e2d1cb662a0d9c5a6467e14a6b", - "0x091ec61180784dbba3a956071b0ae34d2aabb485ec799ea8c87497e5b49f3480b3007cd0f7702e102a0ccb6539f18b5fc1890d0b16f73e5653b524cf01c094a40f", - "0x090a1f5f1dba1fe03a8086f089da4a0598caa5e27562da2e859b3f5846551dea950f7f1f0cf53f6310be3150161472c4d859d75f3085859e821d930e1912efe9f7", - "0x0915c3636da96654adcefeb13d5c579f87742843b1fef93089f35b76c3d5e8617c2b090d6f677baa37c1f42c62f104c1f07f90e6ea1076cc1515c8cd2d752fbfe1", - "0x091c992e8436ac50399a608fd72f85d31112b037e78fee3c761b76de785963943a252216a400a1520a7b0343192aebcd5ea9b8d698cdafd5dbb0a77199796fa837", - "0x091dfc7737cf2922e805b4e86981952397bab897f3bec600005cc01466824cf0b40353260c1c3fae58b6b61ca9d623e25fe2d2816a75edab69dfb3980056f85f7d", - "0x092de0f178aa5aced12ef3723d5c74994c9fd9e2982b030db9d0924650714db0f50c5979a11518a3bbb16888fd0ee1b551ee36b123f1d904d0a1d9ce8f129b75ad", - "0x0915dc4f474b065c8f919dc73a463cab83f80c9396e5b4461a195c991503364797146eb4cc40fb1ce8358b89727668737032373a069d80a9214bf56bd2cff1b7a4", - "0x091cf61858b4105415752514323fc2e0f3849016981492e7ea8427f04f0b658a7a0fad58da03c5eac5e84d351443e19615c75e3d2ea33dd3539daa23b401411821", - "0x090e2be4cf433dd8273c630c5813667a2a41a050f76351331638e8d4db19b611fa024b68242ade5935ac923e7dbb77ac4e153a73decf0be165715fb545098cfc99", - "0x09168f67249a461870a3c13485fe77292bbd64edfd13c25952d39c3684c6e992920cd1eb03cc09e63021664c950b2c4c76d808b0b2afd6054983e9e4e2bbff748e", - "0x092c6833746aab87ee760369019425a41eea6cec2231fdfc78469f89ab1555eb3f19d3c6b18492524cad91350af5ac86fc01bcfab13f8d770e787b6d3bf9015522", - "0x092bbe415fb61486ed17bfc693d06585df5b80eff3cea0e2f5fd35d835a4b77af1120f5e71898595fe287c4aac6e14fe1f97e66bdc19e12b1c65dfa71b25b8ef65", - "0x09243e024ee2fcbbb6c1bc338623418814c3890eadbe4b6af0dead7eea7a437cd208326c4f5d43856e8f7185030724eea1c1770467b78895bdb062c5798243dffa", - "0x092a5474a35902198d2a8a2b412cd0f36532a9a7759b21f945c8afda06600c7de104ce6de9722d65c18f8f5304f25bbd54016a6c493e686b2583f83d8e6c42463f", - "0x07000000000000000000000000000000000000000000000000000000000000000010128cafe12bacd0babcaead148e502ff80917dd24298b752d0dd7f533478992", - "0x0917a0af8213ce8324052e8ed20e2075f9885017bcbd7f33e142ddb08d412b398c043ab7c377e7bc66c6ca88c075123a6cba4604f14ad3991a3cc82d255119b993", - "0x07000000000000000000000000000000000000000000000000000000000000000008ac7416f17dc7f6eece7327a483fed3cd9ca3960363c392c2884e4a3b5ab75e", - "0x062a97f79d7279c8cbf8f1f5974f7c874a96b945d7563f1229bb16399464fdc6232fc5abf0d4fd40d3a2c6bee956a730333d7a3f4eb264a075172383515a4ade56", - "0x041e3d0ba31a2c81257b52d33aaa99cfa8ebb0f2bbfacb1940f5aaecf8e3be93140508000000000000000000000000000000000000000000000000025300000000000000010000000000000000000000000000000000000000000000000000000000000000146bb7b1a9bbba737c173d6bf1d607baf54d160e56f0777be635813ce4b6e9e62429e9d186d0250e5a1cc6b390be8e4891ecf0d146cd606beeaa2cd086b732901301231e4942105a9bc60ab0c3124e6d666727182cc9665c133cb9bbc4c5e475206a2c5e2b519b07e6939363f44d9df4e23af73b86000000000000000000000000", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" - ] - } - }); - - let header = serde_json::from_value::(header_json).unwrap(); - - dbg!(&header); - - let client_state_json = serde_json::json!({ - "l1_client_id": "08-wasm-0", - "chain_id": "534351", - "latest_batch_index": 68317, - "latest_batch_index_slot": "156", - "frozen_height": { - "revision_number": 0, - "revision_height": 0 - }, - "rollup_contract_address": "0x2d567ece699eabe5afcd141edb7a4f2d0d6ce8a0", - "rollup_finalized_state_roots_slot": "158", - "ibc_contract_address": "0x6a2c5e2b519b07e6939363f44d9df4e23af73b86", - "ibc_commitment_slot": "0" - }); - - let client_state = - serde_json::from_value::(client_state_json).unwrap(); - - dbg!(&client_state); - - let l1_consensus_state_json = serde_json::json!({ - "slot": 4637995, - "state_root": "0x40e0a844eddfc32addb999d11ff1adeefdf9283943e148e29834c90b8f386a19", - "storage_root": "0x34a5fe80619df22681e82784ec22b0abbb5a59608be10feb829d2f9adda429c6", - "timestamp": 1711389540, - "current_sync_committee": "0x8b7bec1fb2897203d4f1ad5f68bac7ff9a4dda84f2b88df6284574788f310e759dbc64ff1629dabbad95bcba39d81000", - "next_sync_committee": "0x975901985d1ca8eb87255eb62285eac465bb2b35e44a23a800da2c798a61944c6795741631f0572241293cf35cf48fab" - }); - - let l1_consensus_state = - serde_json::from_value::( - l1_consensus_state_json, - ) - .unwrap(); - - dbg!(&l1_consensus_state); - - verify_header(client_state, header, l1_consensus_state.state_root).unwrap(); + )) } } diff --git a/lib/scroll-verifier/tests/scroll_header.json b/lib/scroll-verifier/tests/scroll_header.json index e91ceb69e7..7f1cab34c1 100644 --- a/lib/scroll-verifier/tests/scroll_header.json +++ b/lib/scroll-verifier/tests/scroll_header.json @@ -1,10 +1,42 @@ { "l1_height": { - "revision_number": 0, - "revision_height": 4386369 + "revision_height": 4386369, + "revision_number": 0 + }, + "l2_state_root": "0x2e5537b891c2cf0ba5e6b3bb68d2d06772c305a551e7fa8a18101ae1b2e4dc02", + "l2_state_proof": { + "proofs": [ + { + "key": "0x719fcdd8a682322fec50b4ca48958cd082f181fe38e628e44a6e6745e213b2c", + "proof": [ + "0xf90211a000b115159e2cf274be4a480850f31ade5f2d5c8250e9df5cd5bc7ea60781dfc9a00c20f366dd9f8a1bd3aa464331c27776df116f49249e97e8a07bdc63b576c20da0731bdb9e0e63d8822eefee6a128fa6d08a1ef785634afa846be81702ef39ba0da0a06590528dd0e27f43682ed353ab3efb997b1e38cb72a5449fcbf9f14927a92aa08becca8e365d7e2ceee9ae7b1f0c4a66303ea3ec8a1bed63cfa48daf0f885ed3a0e05b013911fd1834327cb92e4f7e74bb38ff6f92d0ad0d1d87695b69ebf62c70a0ae6412f3d352a6cdfc06fefbbcd9845bb9b3422c205ddbc8ecd90f18207abdf4a001ffce658c9b2a5b32797f611fafaa21c107dd88cc43aebbd1b8be318f34d10ba0145cddbde2805661d5fc9d8bfac4a3168e9ce299d84c29df85833a5b8a8b0d4fa0a47ce92df9913f3ed8e7a178fb6f8ced040b8c1dcb1076b8280301a50a329d52a07de1c1f78a7dfb5aa2b84e09a837e381b1517d14aa15468b8297977ccb3f04a1a0cc4ed37c770000e3748487aa32ccba9112dc5997884868e5228f200aa362bb56a00ecaeb6cdd27af319aeaf3445b3f771582ceb20d41c480d60f0560712f674dffa016a1a71f7227fb0bdc22f531539053c4136335512e833b9a8a7a0f713f26957ba097c8879c188a6b63a542e61705dc3048a6403b33ed4d2b8f1f873010ce58a61ca007fc91a96001e1f19cf482aa39fc646ceead15370bb6f8d0a9277c47adbf36d680", + "0xf90211a0cdf44ce9e25b57efcc0fe07d7d652ff20153762e5754914bcd48083c4a395cc2a01542071a30263719004733ba2d6885d4bbb1efd594879b2323ec2c3dec2f9649a05ae8e548a9a2e636f049c7108e4250403f799cef4acccfbdc1832cdd6c1e2cd0a02c1d5f59377779e2f655209ba3aedcdf8b1ec2f0f417f196bb3676fc75b2faf8a059e767c07c90c041572c71696b0f52161c43327565656962b7164ae4cbe2da3ea0fd3ddbd5801bdf17d3263d95f6ed79dfb8000048e5c1ea5eb7259a1361b8f940a0e49594ed4b172a96199eaa7a97d1c205db39497cc2f3da01a668330fb84847f2a09a95d518175125866172483a1d4c36c1449314de28dd108b515f9345240d35f1a0782b81d7c9fb297e9d10af1154793ddea98ecf38c0b8292a38cb9ec6694ccdc9a0d5826da599421b90f9e8812d3d867f6c1c693b67771451e215a1822a787f3fb2a0e5650505d2b09c1672a712a17980149582069f54e6100a35aa8dcc4c117b4d0fa05d4f8fe2dfe435b656912fa26a12ef3e870bcedf885e00cd12c5f1a181c481a5a057530a18fac63250a7340befb8dbf402a4ef468072c77e2b40cf065373e5ea22a0c57063ebcdef9d474f11a92461656346fbf3cd6dd03bd03d1d67d788d995fa26a03873d47eefb42c88c9879f388c6dc6ebe495ec439655802ede98e37b0c485326a09e6edd2b9247321aece59161b6d10bb6841971503e9b193e874acfc574dcfd5d80", + "0xf90211a01133306c27f8779185dd8a0098e515cd52779fe9d8d507b5b39fe7ab6516d32ca0e7300a240c5f367a4a7a7af6ef0374a59a41d37d35f98590d4cd1b68b3f87444a043ebc5da4d44f29f5ee19a4dd5a7972559ea5fe3b4fad6caddcbd3541ebf84c8a08baa52401708a0e2f6fc4bc25a9a50cc040926e0eb5e57f48d8d0043e1a6fd4fa0c57970982de27cc3568ca06534ce1055542f8f6999023a52e5141213c22442e8a032bf1ad6a8a0b8f1194a3cdcd37acb3cfe37e74abea7eb19fe41ff05f9c2f114a0cda8f6b2fb8ea4ba0dcb711d49c557b16f3ac60401b2e493f5ef0b17e27801f4a05d48c378a1f9e1e5fa2a356dd8304ef970f393cba4752dc1dce2647aea02a032a0dbea2593fd402d5fba571564aabe85e58d3133fd129b2089dbd00ec07c895e83a0cdae72850b9246763fe5039ea1d2974fdbfc75956f33d1a4e23a8b713fc69420a0c358206bc9fbf8e21b4c1bd05d53c2400c9d107d7717709ae7b2dcf1d9c1e4bea0d96d89e7d61de54e7a5ce0f9fcd3825ab2e958b9db8699363db86467d0f69e7ca081d36e6696cdd65c5bcb14e5ffa09ae39b09dcaa124c6a43ade794c27b7346aea072526e6291d63a2770c3b488868f47381a8476c39b2ed2e9b8ce8d0811ca6a1ca027b546dd194714f17cb3bce031335f3349a26cda1d230acbcec72e32236c6732a06c54bb1fd38b84f06ca77ac74009de0af97870034ea62a86f0a777deb4044ea380", + "0xf901f1a09f8d14a8e464a56ad3cda275041ab176627056f894624024980b403ec4e6af38a028dbcb849747e367e74572292b40b6b36e3e58795d57016e7d47514b98ec88d980a0a0032d9fc56d89669a7fec5d071843014c57c8fe5a8519544458d7a29d268f16a0ea955d50b165478250e584d73bbd2f60ac9241ae76215704bac9d9bc36f762faa04f57706a6615022444ea857dfd048769950a5d20ab86d89f26ba162b951c0e22a0bd3653950d087e95610e0d3a80052c3e7e28542cd1925cc192362a7f22b00689a01b4bd402fd9a327e870b59fad0f3d96a208a0942545a7c9cf9d50c74e19a12dba04adefbfdfcbc26c2321d7a2f73c22d7ffaebde5f074d9cecc06c538c204e0b10a01484f4bffba3fa89001d7ef94fae025a7a3ef9fe08ce88940b1910dd96ebded8a010790de53fb866b5159d48bf7ee8f31728c33562bd3f2e6ef5a8fe06975c033ca07b8facf914520a7e30b4f84b1eafa01e3d4de71bf827f45f2f964606dc1f094fa0bfb7e96e8eb644d254afae1c066b3be65e7a562ab3c51fc3bf119dacac593eb7a003c8838fbae9541056166d9a6fc711875bbd9a2348d3de30575cc86e552d922da08c70f5f7faf0008b04ba5d9480a0929a57780f991e7768923cf7ffe0a5a5191fa0721933d85a4ab5d6180c39660cd8dfc0fd70f7005b9f9b20c465899033df829a80", + "0xf891808080a0a49a65d5c8a51554369dc1c33a129eb4a212616a560b230bb2f3f0ddc34296218080a0f73ac2e3f05cc2e334e04435ce0bacf490bcc54e327583f2312d62b4202a7d6f808080a0c217f8d7ae00d490c94f0dde5b7221bda2efd932e8d5b4fbe40a7f0e6efe33a5808080a063315ac8338e3fe65df494f959d51bf46716bdd3841fd5687b43dbbde3cba7de8080", + "0xf8419e388bb7b570bfb9d27903a47171f6c3f9f6f01df97efcd02cb816e541288aa1a02e5537b891c2cf0ba5e6b3bb68d2d06772c305a551e7fa8a18101ae1b2e4dc02" + ], + "value": "0x2e5537b891c2cf0ba5e6b3bb68d2d06772c305a551e7fa8a18101ae1b2e4dc02" + } + ] + }, + "batch_hash_proof": { + "proofs": [ + { + "key": "0x6f03ba64d87195e325715c9846905fdca8bd692f7dab65dedac7ee82c043ece3", + "proof": [ + "0xf90211a000b115159e2cf274be4a480850f31ade5f2d5c8250e9df5cd5bc7ea60781dfc9a00c20f366dd9f8a1bd3aa464331c27776df116f49249e97e8a07bdc63b576c20da0731bdb9e0e63d8822eefee6a128fa6d08a1ef785634afa846be81702ef39ba0da0a06590528dd0e27f43682ed353ab3efb997b1e38cb72a5449fcbf9f14927a92aa08becca8e365d7e2ceee9ae7b1f0c4a66303ea3ec8a1bed63cfa48daf0f885ed3a0e05b013911fd1834327cb92e4f7e74bb38ff6f92d0ad0d1d87695b69ebf62c70a0ae6412f3d352a6cdfc06fefbbcd9845bb9b3422c205ddbc8ecd90f18207abdf4a001ffce658c9b2a5b32797f611fafaa21c107dd88cc43aebbd1b8be318f34d10ba0145cddbde2805661d5fc9d8bfac4a3168e9ce299d84c29df85833a5b8a8b0d4fa0a47ce92df9913f3ed8e7a178fb6f8ced040b8c1dcb1076b8280301a50a329d52a07de1c1f78a7dfb5aa2b84e09a837e381b1517d14aa15468b8297977ccb3f04a1a0cc4ed37c770000e3748487aa32ccba9112dc5997884868e5228f200aa362bb56a00ecaeb6cdd27af319aeaf3445b3f771582ceb20d41c480d60f0560712f674dffa016a1a71f7227fb0bdc22f531539053c4136335512e833b9a8a7a0f713f26957ba097c8879c188a6b63a542e61705dc3048a6403b33ed4d2b8f1f873010ce58a61ca007fc91a96001e1f19cf482aa39fc646ceead15370bb6f8d0a9277c47adbf36d680", + "0xf90211a00202ddd87e3fb5ce982c2f17b48e48e0864929c0b1bd99eb15246ab3e5a15270a05c2179709992f028908e67af89a765df5418c11a17656e7e021b473b59d4d664a0257912e3c07831f0fb2a9795e2dd709ad3f4b65e500f3fdcee1ff4ecc95adf4ca0b0aba4db08f14d60f87e71398ddbc93ed4f0f00796b05d5793ec856f38da5101a071ac86650b74ec90c790fdf5010bcb7eaca487daa22e5ab01ea880e4367b8eb1a0d548666078e3edd17dacc2f20c59a4bc1692e01622433197f2b584e2cdd18f78a009aa0ad51facaf289a3722aa28fbf2a8fb91dc99f417bf105b2b3dbb9d2f8e48a0a06846c7ad40355cc296f8855a4d96180554c72d7dd4dfbfda874b1f65ca5804a0b0f42c2a8eb5a8ebcba2309e9f9a929159b8495cee9a1dd79df7eb63f00d3ea9a0fe4d0afe2d03c6c00b824e989ab83e6eb7dab8db0c599890e6e9ab20b5655ed2a006d2349295fe5276f11e7a2c30e2237d1f4769a1ad3616fe43f50d4517bc4155a043c6b0edd45522eb56a4eb56e7700600f3da365625da50cce8dbe954b45fee2ba0872df422fd3e9a960e67c3afdfc058fc1f9c0078e2349df48eb0d4fed3647504a06141205922aa8b35732b3c65f37f1f060af0de3665e3ea2196076f5e73eabecfa02434bbed7ae51ccf3295c7a0ebccb18037aae150aacdb6c5be897fb7e95ce810a0ece5363a834ad1c3b5d2370993f7bfb941593fc95de7dc38281e400e5a42d28080", + "0xf90211a0f25ce434479388a204f0b5abe67252acd3aa64ea4beee08d63f3f37303727b67a061127ff722a404ca1fd51e1a0704ad374083642d1756c0b6b38fa8a92a43db9aa0fe2fe7ebafc6a8374723dc8caa69ca4577033d263cdf8d9d4f1eb644fd787beea03e6620218789bbf1146b077cc969256c8310c5e41d6fcb6f21b27a89f2a7c240a0206d3568398ac8fae115f9eca93ed76b5f1e529079009cea35d9d28eb523df46a0e56d7942de6de772ce7e219ebcd48e7727c52d4bfcf113e3234ff5b224f00994a0c4d372b0e6f240b1dd399796934d776512b327cfe951ca31f3cf1a042c98b177a01af0cf9e2d38f116024bf2c4738f17477dc46ee5cf983565bf67ec89d5e873f9a0a04de6e7db567807ab4e8be4450b936e0db9ffecec8c7424ed06623c2a12ee4fa010adaa092f334bee19c9cde409576f3180c1fd438166434b5bedb53be675049ba0daef256e959a64c56e44f0ab0f23a0be0487feb8b6f80d0eabaf620e062a081ba0f77fd042c8c15052c15772c7161a493b767b9a959d9e4c0cdf440b0d7bfeaac5a0576ab53cea58c7b316b9959418c3af05b7ee595dfba595f674dc6ccd8a47f70aa0b1eea262375da07ea6e2df0b0db39dd8b541044907801a42ba03324b3f0b96ada093a65109f439f65d41cc02db79c52d30f6fd474712aa1a88b72a4567dba255e2a0134b40afc8dca88c65a60234db239794372ece0e98897cf4776afefa7fd3ee7180", + "0xf90211a06b0eca5c480b2ad7215c86c185747052f2415f70918737ee02f6aefd6045072ca04a7782f6cc1471627e5b784f67a7ac76b0ff482970c8270987c2041565b7bc0da04b94ab2b1eb36a61fdbe91f1ab8a6818da0892bd63d1519e189b77e12e517e46a0ee4585709035a3cbd036955416bbada3fe179424b5b68e0d70f1b16a21ac3664a0ea1516c02dd35dea930ca80c79d6bb22676e26979c32d2b00e5c9b31227b6beca0492ab8b8f7f23d1b6a60a0e7d73a34a0012458cf9d74d6cba0a6e972e6be34c3a0113147accd7085315e099ea3318f11fa5e6b46bf321477d2bcc9894add80887da0e2ce70a1df7c9e7c7b01e0df5a8fb8cfe3529ceed8662aed805d8dcd7cf4e888a020bb834c12e3626f9977b468417ff7ec2c1c1ddc3b214d2125b243dcbfd5c838a01576b390b70e4ec4d3deaf37ea741d8a6055acd546aa9496dcf055f2a8bf1a57a00fa96d301ef714ff6bdd3f6fbe828172e431a66682bb07815551d56a2baa8679a06a6246fd818565ec408ac11a7b0acd8e98a2be0932d1651c6ef884bfd6edf6a8a0d28cc13e0dc17936cd7b78e363c2c954ff27a290b559a9cd635754207dc2bbb9a07942afb5e966380f264698e78ce2ab5e96766c6f70ee72a18d738039edd7ee57a03929da27f37e90accda6d2d44bbca5e044355f0dda8c876363cfac27d7e3f91da067e6da428fae3f766e5b643634136e8492bbd24471ab4827edf1a2735526926f80", + "0xf85180808080a0e575d2efc468fbeff8b21453a9506aa62eeabb6f36cc529e1ca81d7821e4531c8080808080808080a0b9ccb2fc5ffb8b9b1170d65cef61ca8626e139a1b8ece06bf3601f66ee4f8598808080", + "0xf8419e32c5b748596942f65ff0f485e4fbafa697f8d2ba0311d893c5a6c2a406cfa1a0c643856a01a6274de2e6895e975c0c129761ab3dfa291cf9733a66eee09318bf" + ], + "value": "0xc643856a01a6274de2e6895e975c0c129761ab3dfa291cf9733a66eee09318bf" + } + ] }, "l1_account_proof": { - "storage_root": "0x15998da144c8d0fdbb79608af9f74834c629f4a5add49b48dee7d27ef45b7b92", "proof": [ "0xf90211a0e3104403338d00c2d30efdf5f294dd8e667f748d9c6d1683bab0d79d0746ce60a024cc94676baa155d81f55fc942d6490da00d273b39fff988c1884c8705444cf4a09cf0b0d7e85bab7d5c59b7e9bf8fba716b5bec1fe75a715e5e59fc23832cef72a0cbc9c9a112f8c1b9b5d7fd976d51b10189261712154c1b65a1148b47efae9ddda08b0fbd0de8cd30588f0d81d39413d88f9f29bcb55b453162313bf1305f022eb4a0f251310de48efccf330e3250ad2318355425c3e6f62d6ae379472e63e83e9b58a0ff38b3f9eb65c59f7b78effa3e3f9979b643516847941a60d05127ee216191d7a04972e3ea37e5c2360b31ee2cac35460b343d711b700d30540bc2ea50f0b6fbf6a0836b4ace2c4d56ed2c506adfa23480d102d62c1175e8a43bc33cea42222a86a7a01fc70af24ae7d5ae7ac0b9dbb165e49f5753e8f7e62a108230d3702dbe37306ea08e1a64dae8f230296978d2b7dd8d0b586e21c0c50bf3111d981485885a631619a046682191a9afd4c94ecc475003db74546ad885edfef501705e280071d5980148a05057ccf385db7099ab7dcee5f81abb24e4c2306453c00cbf8dff7f2025e5747da05e9faabed07d8bd51ab7b9164aed1a7a05ef938e1b1d85a5b325c3503ba6ad0fa0455cfdfc6fb44bdeb6d7909ff4f9bb616afbc0d17e7df717e0d8bac1892bd482a0f6e454796a3e94f5a5f768bbffe1b5406b25e7b483cb2c5517a545fcf2d70ab080", "0xf90211a0a9f7056b96b1e601d593a8b0ae3a49b539be3f5181b9a5a1b2de1fdad32b55e5a0d3764a4003c4cbbe6bf106efda9c865740d655237e97787c5255e637c25abeefa0d65ed7694abf939d2eed5496efeb5a90d1315edaa7097508227bd7229c43d804a0285fe51776f5717ce83ca64a7f86ada569dfa9525a644e42ed8b511648c85b9ca0cd3c14b051cb7b820b71acca1217046595f83a362a78ea15678e3e9bdc232f43a07294e56a52bbd8229f9ea7abadcb953bced4d06fa4bfa0ddc1c9a31f3fce7582a02d843b54917be4fbe8994485fdae8b54a1cecc200bae7c63e51f1268bdcea4aea0326392be59852ad9f1d3f147b50a1cde58a32f45991d4aafa6eb8d484380e3dda0d967741181e7ce8267ac60217e28968395e183ae5de0cb235c2eac651d26b17ea09b4f7a989916d4606b0a00cccc45f9be734e2203b43cf6d66280cd7287ab3d71a0c05ac1dba791abc6c26b70479fa4c50a864e395ec885bd99691897fea4fc69d5a0ce6a3acf61d9abf06d930758ab66b7343f343395783d5e382017a1e4da4d90f0a04c75a03ccd848c062e1c7f29e2abe9bda129be3c77c91e23e629f145da2cbed2a00f30ede66287708e06ee088de7ee99c223aa4f38f65a44f5022898c15d8e2208a06b1734219ffcf08845cd75b736a1923d9c5b95339b46be0a62faa92fe446a7f1a02caa87a43c522273917c3361147cf9f65726edb4303bf08472d1f731f7f1d8d180", @@ -14,45 +46,76 @@ "0xf901d1a066d423d34e5a9b16cb92a7b2cdf53f05ab66d3f18aeb38d365777649d13208bba0dde2af802f10a487aa846f0b02ac06bb18c9f508aa4cd2e6db0b1a0d7dc6555ca0130f2594c868ebd78c401c6618a7d602d80e0197d5129ee07d0bef880059a9b5a0afcd23ba8fe2f7c882188bd4a5a8cb7ce87299736495d309b90d92ff87b8aff6a0cd6ba81a6514383d48a5462a7a5367178ef1ad8c9edcbb1377f30522709ea771a098cdd210dcceb35846cf0b0fb25cd89927078dd5188b80985923ff56ec3441f8a096ee188171d9b276721f98abcab6488d7b65c563af3803627dd1c405e1706dd6a077a17405bdc685b354cd585b451222cc6f700b718e00307b06cbfc6e461da14ca063855a2ef44156d7e415e7aca2dff91e73eb882388012b2b943126b715ff46fb80a00741317947e4f7ab90115623ddde415230727c23db69e823545eee11bcd1026da0ca477a6f6494f2973d7aebf600e47061ba702fa28469272cdd48df9f38416a46a09d8fcb47e73f0ec91b70e7d1d25ea8b832f538848079e2df60be7fdfc5978a1e80a010d68c307a7c7227437c9271d90fce3494319650d78bce7a6f35847880cb5e9ba05edcf0a5cde11abb08c394c81d1e78d8063809f806b551c1f2e4a7910c5013a980", "0xf871a098dff7457df691287379f14f3c86c17181a01e98865801c1faeea0752e6113cfa05825c5dadaec2cbc329e20866073b32e850c67627d0a46f8ecb568605edaa72580808080808080a0c43c6c9016fcc2c015790a838e8d1cf7463ab94893de8981f3456b418286a67780808080808080", "0xf8669d30f80e30c43f7af65d01662a3164f088eb29e38f1a3a3295a28878b474b846f8440180a015998da144c8d0fdbb79608af9f74834c629f4a5add49b48dee7d27ef45b7b92a023c736713c762f5d684fdda5244e49dc182aa801b78383ddf51015c1597c446c" - ] + ], + "storage_root": "0x15998da144c8d0fdbb79608af9f74834c629f4a5add49b48dee7d27ef45b7b92" }, - "finalized_proof": { - "batch_index": 65032, - "finalized_state_root": "0x19d64b8d0d871a52e43e3098a2ccd5416b6088d20f180d09137df4d512756df5", - "proof": [ - "0xf90211a000b115159e2cf274be4a480850f31ade5f2d5c8250e9df5cd5bc7ea60781dfc9a00c20f366dd9f8a1bd3aa464331c27776df116f49249e97e8a07bdc63b576c20da0731bdb9e0e63d8822eefee6a128fa6d08a1ef785634afa846be81702ef39ba0da0a06590528dd0e27f43682ed353ab3efb997b1e38cb72a5449fcbf9f14927a92aa08becca8e365d7e2ceee9ae7b1f0c4a66303ea3ec8a1bed63cfa48daf0f885ed3a0e05b013911fd1834327cb92e4f7e74bb38ff6f92d0ad0d1d87695b69ebf62c70a0ae6412f3d352a6cdfc06fefbbcd9845bb9b3422c205ddbc8ecd90f18207abdf4a001ffce658c9b2a5b32797f611fafaa21c107dd88cc43aebbd1b8be318f34d10ba0145cddbde2805661d5fc9d8bfac4a3168e9ce299d84c29df85833a5b8a8b0d4fa0a47ce92df9913f3ed8e7a178fb6f8ced040b8c1dcb1076b8280301a50a329d52a07de1c1f78a7dfb5aa2b84e09a837e381b1517d14aa15468b8297977ccb3f04a1a0cc4ed37c770000e3748487aa32ccba9112dc5997884868e5228f200aa362bb56a00ecaeb6cdd27af319aeaf3445b3f771582ceb20d41c480d60f0560712f674dffa016a1a71f7227fb0bdc22f531539053c4136335512e833b9a8a7a0f713f26957ba097c8879c188a6b63a542e61705dc3048a6403b33ed4d2b8f1f873010ce58a61ca007fc91a96001e1f19cf482aa39fc646ceead15370bb6f8d0a9277c47adbf36d680", - "0xf90211a0ec071b1cacb26657575567d3ee108ec3b9cb45d979e4c930037687a7440c254da0b856733da6cd5a78856f5bbf1f70648bc581a39bfd79e66916e9c3f3c6ed899ea0a84e5343dfd99c8cb6a42d0a3c226009fc67b030b66605831061882ab94ed606a079a789033da613d4565516b6abad30970efd06879dcb3160d65b0edb18df5233a085ef96ef20b81d3326edad313e4b4d34346140b04bdf4ba229e0ba9534d6733ea0b3c00dc356aa36f310611ec12009f12821aa950c2981c3861dc3dcf795278b8ca01ca18899cffb26c1422e4555282ab0dc8cf29c725e9a9ec010db4c7432d21acda06dd5fe1b4de2a47630457aedf3b4723ad98488854e7d8e850c946c6d720930f8a077878d80c5854a8c5832516a1ab1327b57a112d0b0e95d2f0119605e614c5907a0cfe8ba6ed2febdc3860fd889bf9ad2d2196280f2d2973b5e37b19d4f7ca68410a0461aac7fd8814fe13649d9812f29cb49f68a7d3548c54281b772c14c59c81befa075df6eaeed12a032d28992db7bcf54a8e05fad707709e67ba02998a6de1a3d6ca0b24a319ea3846bf26bf2659a58ff5215398a67f0e2a445b0a3d4949a4f75a29da0fa872c52a099c98e8fabcf4a4fe0ac34737485bcc3e737e72727ad233c950726a06e4e1e914d3600d3ea432c99d7b0d9fb9672da2c30c4e6d4e5c5abb698ffc2c6a0e587d63348abe75005b819ed34cd0a366f5eed3425c7616a992a47db3790584b80", - "0xf90211a04b7698ea97dfaeab515f006f461271820e2a8da9f4bd0e4014a504f6f33d0f02a04fe0d0e3ee6aa5f891408bac706a344299d2b6ecede5a08b2c011a1d34740da1a0de56bf16506161895e87320cb7da461c1e3166b3249037c016d55c2c4950855fa00fd5ece9f7719ab4f9977263021dbff0f4bd3d6053244de27e8a7871bfd28294a0833863bd15733967a939fd924170d59fd4c3968a878842db8e54a18df32f00b6a0e075498b340339e7d91c554808694eef7b39f6db3ba9717e450f3e26ba82d75fa0819290a7171149823f9b6ecfdbf7adc557159504c40e4cf5075cc08b28e43c36a03a163976b31b9b012bae976ab96d367d6af086abe4adce21f9e78612be9a0a68a02eede88fbc6291a8944f0408b17b4c2fa09e3be23968abcf04c5c5635b1570a2a060489218ba1077bb4b65b7d79b267e9913593ca03d13bd8bf687504a97aff6b2a0c8c4ea5f2365aa2730227242016541f8a8095eef37ad792d42f5f42e731e9403a01855c8a4a0cf7b89e0a982917304d44f213a2e47b16b4725d036bdcbb77ab2d0a0fc626c303e01fc1d764679ab405cff2be2d4b1e41d2c3deed6af899eb736df1fa00470bc85d6ca7cce6567415338ef4556be8fd44911d4a366c54058c12671fcf3a039de961dfcc0b382b595d5eb63d588881974520203fa892b5b1858a11bc013aaa00d0e71c41837217e8f427952c5afeec1694dbe9e26441edc4b542e6a1ac279c480", - "0xf901d180a0e5de10362ba44bb30c5fa9cb8c55500bfd7a1ae651178a258d33a6e13880c6fba0e897ba48c6a36aa5b28a0666aea50fa2cebdc913fa0d578e034cfe147320cfaea038a6cb73f76c1b0a5e88df2d914fd959708519e86fe7e57c564bdd2f86ce9ba1a0a49d96b6b830773f4eea382c2deef7d7674f9608d056e121496f73bde0a27dcda024a41879f282a9c26f573276954586be434f8b155f20d07f12480224331e3bcea0e7709b2c04840fe5f96db4f0aebb371fb1bf1564af12259b4609ffbe107fb897a0cf34187a183a96d77deb4933e7b972eb76d2de43474ce373ee00724858cc1390a0b22f65a38f4114d22485186364beb51f8d7b59030dd0d6aa23c5abea715f9338a08d1566f4bebc2acd84c456c13763cb1e111268896c7db67ccd64cdcc4e0a2813a01e10546c74c11a73473ea258be5d87e4413188bbc1f6515651f993359525ff3aa0dba3d9fe58ebb26efd520624311f7b44995c12fd723e57476c168e9a293149c5a0d75710ab271d3182a58c64283f6ff5334db3cb75c50b663a7481c2c6e54851aaa0febf53cace68f06e985b9d09b591e30594c81cb9ab64b302a3bea7994d87cd5980a00a34312fbc785ffabed2e2b722195625e59789119b4526e3f6ea13693fc9c7b680", - "0xf8b1808080a0e3d61e8ffbd2fbe96944d7feec69add2ba740121b9c78270acda797773a6fe628080a003937b5aceef14d29ddc8b1fdcc45a8104be7ef1644fd9d779ed43ffe286f7aea02d9a05c74921b54a202d4c91aaca54a8a5547cd80f2f99f767ba5e2f1c027d3280a04a90780bd9266c7715f876ed96bd357ca4347a884c3be3b5d6802f125e04eb14a04a6d451174e49f45bbd0829ad21c7b4bd870ee2a23dd156d153ab12f02cbe8b2808080808080", - "0xf851808080808080808080a0e2901d76ce503b69c84f14cc0cfa53bdf7f307bd5e2d4daf27d7340f9ec788c280a07be3226ef884aa407425ead6c26308591338254cae214695869016165f6d063a8080808080", - "0xf8419e20d2c348d471f7c4539aa47246c06e16984200f371ea99959044c7748565a1a019d64b8d0d871a52e43e3098a2ccd5416b6088d20f180d09137df4d512756df5" - ] + "last_batch_index": 65327, + "l1_message_hashes": { + "1006795": "0x41122df297f0d03c1ed701ec293249771ae3d7b759e79914eb965765b103c9c1", + "1006796": "0x1e85b9695e863751c5ab1a2622d17434aada8efc677982aae4eb980b1ef98a03", + "1006797": "0x28c4d331dd9352075e8530d5a04547c89071543b3fc03dc475bad24acfc1db7c", + "1006798": "0x15725173fee42494d9e38966fdae179147ad38c93d6c1b32aadae5ddf873b5d7", + "1006799": "0x29aa3d061c7ee70f24bce74ce65594b636d524b1546d2b4d7a8f7f1cb5f6732e", + "1006800": "0xbd02772fe1efa157cd479e2857408ef9c3babcb05987f15bc56e109e1853b847", + "1006801": "0xd0a1c8b053d670eb6fde130041dece363a49612ac3c52c781c926a7a4da7ce54", + "1006802": "0xf4301fe88c7461c37e07ce59f587241af8f30dca399d0a3fc238e824647da256", + "1006803": "0x2fdabfe1d43111a63b32a30370bd5ae08c799bdeb1c3810c119626284721f9bc", + "1006804": "0xeab5604293d4f3f2d5cc2a19fb687f181ee61720ece41b4bec4d97762d974d7d", + "1006805": "0xb66b2e4313c135be6fe4ae264bb79560e494e608ef1b46b96eb4ef4644715ce7", + "1006806": "0x808f5830761a232169bcedd7c3fee827cb746425801f6ddee90cedc3489b7da2", + "1006807": "0x2d164d24a57c9fa268fb304940e45bc9d4a31496646477324ff9421535a80623", + "1006808": "0x8665ba6c969d8102d1c7cbf3c8507e922d54377f5e77a955d8af50ff782b923a", + "1006809": "0xf79257a382e1220ceb7a09700f8d34dbb93a30088bc4e0fcc983c80418a3236a", + "1006810": "0x411f72a9b21793236006f6cfd7f50a9e812f80468c3df5b90ec19fdacd886aff", + "1006811": "0xe21b8ce57007781bb839043e3cc349a739dc752249e402a3f89046cb0f836def", + "1006812": "0xfbb6d35889ecea920096892015de541d80e06c71e27bb99725a46ee7fb70ad1e" }, - "ibc_account_proof": { - "storage_root": "0x0725812fea38ac34783b0ca9ebf981e44937bcb47f11b1a12a0b040ebe370098", + "blob_versioned_hash": null, + "l2_ibc_account_proof": { "proof": [ - "0x091ec927cd0ed0719e427db420dcceb563d7477be8173d4cc0cdd7789accfdde5319623b9e0bd4e38c07196a02f801f3e305bf90ac8f41cff3b777402d03543da6", - "0x09267da2ef903f9dfbb659707b46c1c261d02431d0df162f9d12df525c90f835a803882033c016d3bcba74056ffa3095a43b7c4123edae6804466cf78d83c24079", - "0x0903487263bb8005c5ee13c30bc097d68a87edcc98081c5239abce182c32a493ad1ced1d15c9c03bd1e6d2597aec8178f3f857a2ed5f00719b72df37eec1053c06", - "0x092020d87cd7007f5c47b1626a284ca64aba589fb82aa2b5b12cdd692706a8c5082fd3b48def867cbb9c561c9a7fd5d4a581e844701ad7e72eb293c0715206a452", - "0x092207bf4d0bca70e561402191cac21a3e5dda1cfa3d4e40c12b6c3d609cae2d8c277c0d8b03e008c3252b6b36ca8786540ad45d32df2d4ffbccde0b8e9cfa39d1", - "0x09107f0cb70fbc6ad955885a66952b25355b6385c03408eacbf40d30cb0f107f412328fc2df8235d660da139bccb4507f2ebbeac3e4c2cc8eecca6778a8209fd64", - "0x092f636ace564b6704886cbd2d0a411084ad82343949badd6ed7b715205fec70311ecc2ded6af24969809183fa858641b6b398bec32ee3ca8f197329a5d53e5072", - "0x0927b7486b6ab75eff9029a7c7950a94ce1daa9f5a1f4ef9d1e13b182e9e4cc4200d9ec1e994c55b56e1b0ec3c5c76202671168ff5214e6f7be9998e8d784514a9", - "0x09111935b9772e241cb315e0baa7b69a633607b849e81f5700d29c700a5832680806a81270629c132d4f3a0b3eb0bf69404007362e87d2d62ee8667de907cbb10b", - "0x092c7685f427d9465928ca26b99d71d38661aaa4e5d3cfdfb4579c7a20a7da05be0376295c825aa8cd6b04d91da735edcef21d12537e3734ed47a38ad9b37ddb1e", - "0x092705632ac7cd56abc993716766ed5362d6056cd8b1c779e17b65a134776e9fd211d2d38dd57928c5535f46fb980ade30faaa93f60aa9135e259f9fbb8516e617", - "0x092c8cdb7f5a7d341268d308caa56b5b7b0b976ff7f8ae6d496ac8f2be44c34ce62ea66ad36d479deacfa3b9bdfdbff64b61f77ac65a8e59e1f0fd70653f1aba40", - "0x0922b06a802cee22d389deb2774f65775b64ead289a0e3cf93ba0a262accbf49bc10f71dd20f3ee62d3fad278c4528e6117e3bc9ab88b54d718c6292a306bc6736", - "0x0912456c96e569d41cb80c5af568a2eb88052da56af1ca591044845ab2827e50d01f61a69dabc6701ac118bd8e62fc6693079edfb5dca360c380fd2e1b35e4a7c3", - "0x09226feceb7f57f346a75f47cbeb6e122c96f65be16e28125ce8a33f6000285b532d546928fe8ebc8a7bc37c957aac8cb606737b0dbfc0c6892394b71c55c81afd", - "0x090831e128c41de7d5d8d4bf4dbe03bdff16458c54099940f8c8895df78849c67216dc66be64cc768e51fa837f52cacfd30a7d18b9f7dea7c56dd6623501d51243", - "0x092087877d5761a3227515671a444eff79076af3709bc99fa9b825bfb5ae06f6e21fb7791fa9d608373de1c08fe776ddaa66ea87c67184f0f6986e0e7ee916ed01", - "0x072c86f91ca244d0b42a419500cec0bc5dffa237af9e0e2b4cf6e418fe77e582e4085f03ffd96f29ef5a4e29e29dc4cd9f8ccacf4690b5cd200a41d5275baf9b4a", - "0x07247a801e8358b138d4cfd296f737024a266641ba651ff40ebadabe3953ea07ca19318923e8de7287a2d1d3f92dcb517797fb49187536cd1b4c33284e4900843e", - "0x0418e69375a3fd8156d2311a171d3541440ebe34fa5e86c0f5b39fcb970fcab5b40508000000000000000000000000000000000000000000000000273e000000000000000100000000000000000000000000000000000000000000000000000000000000000725812fea38ac34783b0ca9ebf981e44937bcb47f11b1a12a0b040ebe3700980ba0d7d8c9e10541d8ee01ad25ee8a8bd8a69ecc4c7ca6588ad5f3fb2f59b89111d52d1e566e821ac1ff5b222358a8a950f1acbb064846d0aa7484509c4e1e3020e52c957533bd932e357046bf721d2bf2368ef1b7000000000000000000000000", + "0x092e9fd31e6bd9abf5df5662625dc1178088714ddbfd3d6d3beb635da704ada55622a4888e7896024073f64eaaeab81154e47d9d311e11d1a88fd2a00a681e3d80", + "0x0903cc81a878036f9e6d0a8717d281c284b34a1a34e780eda1a6def30e9dc84fe406c6feff10ff1cd0f83d7577c8043075029c5e8922c455f6938d0ccac88cc69e", + "0x092cf7c56d5230cb2c50223452d16ef72dce99da4a4d80fd7c01f997fd5ef81b8b2ee7d26ddc0e8578b16e57dd02f47cd0cad1279ce50446f35a75499b33ea2db8", + "0x091d7c3867b6b9bd9be10a4d45c5b65b4cf92b0e6176303d02ca1964339d2666a0243d64898d02791fbc3eb5b6020ff0a2cecc063bf25ba05c981ce1a5f74dbe3d", + "0x09282232126cb08638f9e0938426905b6b85c643de0ff58a063c6121b824ae339c1b5a4d10ec252efb0b72397df64a4ce34dc0debca615643c5ce561e3787d93f3", + "0x09274da936258084819672420319e29d5ff18e9906d0c8da7af2fa061549f96d3020de31255a92c4f22ba1d289dc2d5c8816340ac28169738fd333011500f9e9e6", + "0x092bba95d3d09c15eb26a277b35014a3aeaecc62d711de4453395a4e6703cc7d97160cd75e3e39f670bba0f61ab23a0f8e048f71634f83ff331ea7bf5481b73d87", + "0x0928e9f6c9e39670dfc4e18fe857105a3ed9339cc45decde27a4c60bf695e9bb9614f938815429c7eeedd5295112346b3222b18661f5edbf76fa816c1e4f72aaa9", + "0x0912d710c6eda8e2189b7bdfd50fd42459471fa11b5e22e7d7a2a27263c324756e1b81107e291fe3c4e6bfa735d1312e7356b6f69b38340bc1ca06fefa361a67d6", + "0x0919f9542e89e676a66dd6494538a06fc62175bee4899773343f5b4817da4144fe25656d91fda6d72f3451fcc0d57f3a484b871e040896fbd0f66c3e12090caae6", + "0x092177170d5befc5d0cbd497264643eb38d100fd63b1fc889e43727a63a1c6198125825e171bda6951492f794b1f9e2b82dfeef4aa660c74dc97da7baf2c041e07", + "0x090ddb3724f9cecef4cc7d032b10ffdc96e94686b98330290cc6685ed2853043cd1469fd82ccc23306dead359574f6ae03e445fdf1129eff7fd2058abe0a70675a", + "0x0920fd0a7860c7d85a74fd3215f9d677e69ffa1822b4fa2a8b7bb5d8ccd5d6e04314845834df9eee4121577ed8b0321bf3e5f0d34cdfc20ff4a308a0e411811976", + "0x092dc00daa96b42c84e0415b5da62cf0658a3cd8968d6a92a1e49270e9c3ca88d72f85ff486c99a41f4d6479f6afaf86d279e92f7a16b81680654917bd31dae63d", + "0x0901ec6deb4645f02ed95685a43a82186176427c89a90170c163a70db370f1eaa52fa207d906cc5bdcb656cdcc54dd105e5634aeea9c83aadae1058f972b48042e", + "0x091d980034660552a8553611f1fa8d4eb839bd86efb99c5fca5bda905bc5679ae203250814f36101593308ec5db798645319c6fea28ae7f2d2867f9be47e0833d5", + "0x0917638782e520c1ecee645a6cfc3adfa7d23b4656b3fa1e904bbfa5b7a2b6b7b41f6a2e41c3119d75ceb0f555728614ad62b7669292c7a7d16fc85ad946e2749f", + "0x0911a0f83291de5e4353815a7523048458c57469d9625ceec99416792cfe072ac10160b797e91462316ec757c109e294909ee945c817006ba42404d550180967c9", + "0x08002548d5cce112b0b1e8a4167c469a239124ac1df014b8165e29ef8852f8dbe51fe1fa0144e13a8357f4d8e7442d23b67e04fedef9a9883800804a935d0eef38", + "0x080424062475fdd0ac74ac4ead112fbd8d4977c9fef5f670de35176358cebb6c6c16a9a7f36ef9800322bf50bc14f0640b6a4329f3b298c60cbfeac35105296fd0", + "0x082c552da48e88802b202ce036cfef6d2a657c7e36a19ef6d98c5a6d63d53292ca0000000000000000000000000000000000000000000000000000000000000000", + "0x08279c9516d22de4be4b648a1bc0d9345449ccfe0dd34511a437c6aaa5855eb3ab0000000000000000000000000000000000000000000000000000000000000000", + "0x06200fe6e24ca297570942c6c7ae87142cf9d05b652bc76559b51b34918d39c62421dd3921bc6242639b4046eebec2ac92b8fb90fb98dc4d9108da5ed16a8d6cf2", + "0x041d3c5f8c36e5da873d45bfa1d2399a572ac77493ec089cbf88a37b9e944284220508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e35109a8967e5c50000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200000000000000000000000000000000000000000000000000000000000000000", "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "storage_root": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "commit_batch_calldata": "0x1325aca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000007900000000000000ff2e000000000000000600000000000f5ccba6a5fc17830df0d590c3d9274a32aa85d804f6194ec280b18ee519f17753256bf9580cce6a9e052c49b091dcb7c7555c147f088858834ce410cbba72d1d7e62a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000001dc000000000000000000000000000000000000000000000000000000000000029c0000000000000000000000000000000000000000000000000000000000000434000000000000000000000000000000000000000000000000000000000000052a00000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000099c0000000000000000000000000000000000000000000000000000000000000baa0000000000000000000000000000000000000000000000000000000000000cac0000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000011aa00000000000000000000000000000000000000000000000000000000000012a2000000000000000000000000000000000000000000000000000000000000137e000000000000000000000000000000000000000000000000000000000000147000000000000000000000000000000000000000000000000000000000000001bdc1100000000002e08ae0000000065d38c3c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08af0000000065d38c45000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08b00000000065d38c51000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08b10000000065d38c5d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08b20000000065d38c63000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e08b30000000065d38c79000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08b40000000065d38c82000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08b50000000065d38c8b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08b60000000065d38c91000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08b70000000065d38c97000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e08b80000000065d38ca0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08b90000000065d38ca9000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e08ba0000000065d38cac000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e08bb0000000065d38caf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08bc0000000065d38cb2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08bd0000000065d38cb5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08be0000000065d38cd3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000090f88e83095eae850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000005b0ff75cd83104ec1a09118e3e0179ea5a4d6c3bf2ba36a434071b755859937d54e1af47c4a071382dfa00e6a7035c9146960c599bd4958d1654e0176e95d4474c4cacb4f6ed6e5351b4d00000090f88e83095eaf850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000006628d341683104ec2a05ec1d237325b39d3166bbcd0e5d7d977895bcb9e1ac5394d0834d5c36f91733ba0753bccaaf0438199afbe8ecfa486a2f47eb83105513cbfcf596c2959fd31b7e600000291f9028e128501e36428ca8304904c94bbad0e891922a8a4a7e9c39d4cc0559117016fec80b90224ac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a40c49ccbe00000000000000000000000000000000000000000000000000000000000254b4000000000000000000000000000000000000000000000000025e2f8711b0801500000000000000000000000000000000000000000000000aded2ee81b1544ae1000000000000000000000000000000000000000000000000000005d6af0de6e50000000000000000000000000000000000000000000000000000000065d38d4a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f786500000000000000000000000000000000000000000000000000000000000254b40000000000000000000000000815bec0de3f12ee8bbc7525bc3c3188e1b9d59300000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000083104ec2a06488c7a4feedd44b9539a9c2d0abcbd52ecdc512210d021253baccb1e7fdd739a009171b97d457dd4bf527a19bd56d03051f5b8cbe3850c8d264b03c21cb8c331300000219f90216238501e36428ca83039ce29417afd0263d6909ba1f9a8eac697f76532365fb958806f05b59d3b20000b901a45ae401dc0000000000000000000000000000000000000000000000000000000065d38d7100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a861500000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000daf399baaf8abfa2f307c73bf498437c4da1109e00000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000065d46d9677084d3e96400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a03dc4d29984b5207f2f0779332eaa598d0520f57efaa7095b4bfb133a7800796aa039f533f648e630ccf17c646c22d98e8f726901eb5d74bed3733acffa5218775e00000090f88e83095eb0850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000005cf61f2fe83104ec1a09d1cd81294a6e2b34ebb737f09b84d62b8059ffc9dd73a65608bba6dc7834526a06503ba84a711b8476570faa5c272e513e64952f379d95ca9385d81c90433d428000002d3f902d0823b4f8501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b23203020300010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004b6da6f5293000000000000000000000000000000000000000000000000000004b6da6f5293000000000000000000000000000000000000000000000000000004b6ec004680000000000000000000000000000000000000000000000000000004b7101f1a0000000000000000000000000000000000000000000000000000000000000000024204954b3ff5e79b8a128d225f8eff4703d4be0b3e066edfaceacda60c70df1757d73368832028eadaf6c79ce7faedbd73ddbd2ad3e5050cd5dcd8d167e6334f000000000000000000000000000000000000000000000000000000000000000265bc495200f3b8c4b1c83c2a5cc179c0fbee42798fcf2f080e5644677bba4b113665505eb94760c5b683390b81d974ef31e6c59baeb1cc06ca5e6552153d387483104ec2a018c6dc3a48ff3a6cc855a6e2ecee943e891d3ae3b1a79cb0f641a11367f44fc1a05bf2dab7d2da90feba570362cc45f5317dbefad4f9698c043a9853bf9929a7b20000008df88b138501e36428ca82a72794530000000000000000000000000000000000000480a42e1a7d4d000000000000000000000000000000000000000000000000002e71c90e65af3283104ec1a07077a821130eb77ad25d6ef261cec02bc0fea0684f0465aa66a0cea3193e4ae7a002388c45064943f21df9ebf744ded07cf166b1a8aff2ef4edeb082cbfc78e7ea00000090f88e83095eb1850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000005759ddba883104ec1a048bcff9ede17780f51aacc6cd328514901b1160762a19592dfde1c01195e95aba04b9ed0616efd4c02c687d51c4f13693e0e89bd72a4d46db21d04b2ac46d4ac6300000090f88e83095eb2850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000005c0546bd983104ec1a046040c89973c5a4184c34291a3f953eabd67e6addd37fa8415fb22b2990d31f2a01e7a41a11cd2a5edc6e738d66599b2ca2bd5111bba9d6fcfbeb63a30a2ca0de6000002d3f902d0823a208501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b23301030002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004b7e4f87b27000000000000000000000000000000000000000000000000000004b8181c4740000000000000000000000000000000000000000000000000000004b83213486a000000000000000000000000000000000000000000000000000004b83d5d0580000000000000000000000000000000000000000000000000000000000000000261e53ee5787abd11246dcfce5c86bcdd2be25f557cb6fed11a3959db2a8a8d0378315c31243e1446fac6dea762df98f006c3825fd87d2700e49833c167d96873000000000000000000000000000000000000000000000000000000000000000257f0537c5ec57fe8f094261c68c954cb653ca9bcc85bcc980e5103c9264a96bb7d242adc65591ebb6f486916d5cf6d8b1d3bff5cf0428d99d1735599dafd959083104ec2a007bc8ac3ddc344e1bcec4be99dd2cd374463f65b9693f300af0e9591a579ff3ea079338958a59740f99bc3ef42f7fa7e327f6ee948e45cf739ecd17ae7aebc9eca00000090f88e83095eb3850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000057137d35d83104ec2a0e33a54b970f169753eda72588509c03588ac076cc034e3249103da87befeab44a01d7b6a50495b95f86e9e3da18cfe30a854289502de88188090c6909c4f31487a00000072f8708207728503c6c8519482520894ea102f931f5eaa67d8144f40a536c35d97df6ec0872386f26fc100008083104ec1a031e7f102b58a6f1c9c3987b935ce266159008d1bf4cdcb5cbe81f4fb41d341dda05c3c9d6ffe6a7659d5a80405fb0ae45a59f8ff608cca4a3d4c91372787bba7f600000090f88e83095eb4850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000061f275ac083104ec1a0a60c6e1a5945c62df2e50f399bbe104f4894c6ff54befca73ef846f1fab64d56a050b12389dfd4d8ccbb841548fefd3fc7edd008bcb6d54a3f2f0a5b95716083ba00000132f9012f82acd285024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000280c0000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000000fad0fc0000000000000000000000000000000000000000000000000000000000000001083104ec2a05851621946538766937e5a4e016d4be4b780a5d6831faf7c7a9d81bd7e518553a03d1339a82965f6bfed942c47f1c8fa310d0b56910d3e51d10506cdf1f7a7b57700000132f9012f82acd385024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027a1000000000000000000000000000000000000000000000000007a48b6e5cf231b0000000000000000000000000000000000000000000000000000000338eda400000000000000000000000000000000000000000000000000000000000000001083104ec1a00b1ca424366cc13fd22fda7e7d12f4c57690573118e42df4d3270447be441272a006cc2d1610dece1888f80f7e541d7b3b0639c88ac6d1b7fc537f54f4fa65f19000000132f9012f82acd485024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027b10000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000006748d06b3000000000000000000000000000000000000000000000000000000000000001083104ec1a00a6770bc3298149ef959fdb88201eccac8e2a60f4ab42c3db1e8eda427f7853ea031ce3b30fd95e73c4d7359d8e5884d352a3dcf16716527f4f7aa7508d48a698c00000132f9012f82acd585024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027e90000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000036cc278d000000000000000000000000000000000000000000000000000000000000001083104ec1a0ad0c305e6313bbec9cba5133d409276e2a50bd30659ab28a3a14ea56d92c2a65a078633a5395eae9b3d12481b058833c16d0ae0f92f2a58d99937d9c3b476f056600000132f9012f82acd685024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027ec0000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000009cc29d80000000000000000000000000000000000000000000000000000000000000001083104ec1a076585d6f75194d7d45bb2a9d9743a6aa9d0bcc4368f595c78c74692b0f6ae45da037e876c06c7d81199b6347b05075c186b0f0b424632ff4c6a8b644856e235f7c00000132f9012f82acd785024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028070000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000000bbc12f80000000000000000000000000000000000000000000000000000000000000001083104ec1a0992b006808864294a424c97b6cfddf33b2d69a463950f184fcd53220bf9517c2a07d4ff51eadb3585e268bc389fcacf17e4347b384b93f3911860ebdf974c4ed7f00000090f88e83095eb5850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000673a5730583104ec1a08a915da3832dff84e35d45c2d36b1d35290e2ea953292bd12c0393980bae012aa066943a58aa4aecbbde0ae25f606c99403af3be47bb782c8c2d116df3dfe2226400000090f88e83095eb6850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000057141c98e83104ec1a082b520e880ae77880a704f5f50e487e4d311c6729be0ada16b814a6f7b9b1dcaa0638fdee4253d5323a2a0d07c3794be4abe340a7523831aa235662d6a6540cb74000000000000000000000000000000000000000000000000000000000000000000000bc90900000000002e08bf0000000065d38ce5000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e08c00000000065d38ceb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08c10000000065d38d12000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08c20000000065d38d2a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08c30000000065d38d54000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08c40000000065d38d64000000000000000000000000000000000000000000000000000000000000000000000000009896800007000700000000002e08c50000000065d38d6a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08c60000000065d38d8e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08c70000000065d38da300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000008ff88d83095eb7850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000061f68eb7f83104ec1a08fe4af715c9e3fb206242fd72e7bc5ad1295cbe2e51694757c25b490bfb9fcd49f5496ba1e8091e899100836261fab9d7fb8def96d7d0d66eb3f111816ab20ff000000d0f8ce8202b08501e36428ca82725294b5ef491939a6dbf17287666768c903f03602c55080b86467acd47500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000f0944a8f26fcd80083104ec2a0db622cf23b75b702d9180045fafe83e280a27b64fdb62ae243c017da36817d83a07db1cd84da46313447909a8c81646cbe465fdaa2d2f0466bbc2e05c0b3c4545b000002d8f902d5148501e36428ca830a18b194bbad0e891922a8a4a7e9c39d4cc0559117016fec872386f26fc10000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001648831645600000000000000000000000047854ece53d37ffbb6eb65877ff364bc98013d7000000000000000000000000053000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000002710fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2766000000000000000000000000000000000000000000000000000000000000d89a000000000000000000000000000000000000000000000031658a5646d1e70ea34000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000031460b6a211e6204d290000000000000000000000000000000000000000000000000023702e605172b20000000000000000000000000815bec0de3f12ee8bbc7525bc3c3188e1b9d5930000000000000000000000000000000000000000000000000000000065d38dff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a04242dc9767f87f8cb24b6b61fea7953b5ea968a5c0be6fb6a662df7beec340fba00f574fddc19411ce873dc04eeaef9f6dda34cfae722a3947948232049c86bdc3000000d0f8ce8203608501e36428ca827d1e94b5ef491939a6dbf17287666768c903f03602c55080b86467acd4750000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000cc7c561c83104ec1a06a4d3c03bc22dfc394ade44e75363a60714bc4738ecd4bdecc444bbd503de904a0595aa5558067d2e54ede7123fe54b6d557a64134c8e89c65e5b50e4be683243300000178f90175568501e36428ca830f424094dcb58e26413f087312c2be7d8c1b8b10f90b6c5f87753d533d968000b901042a986e340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000753d533d968000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000003f616c656f3171766a357361726a65647570673735676b6a7436637274337338716d7038306377327539377170683775706178796871767667713279373874390083104ec2a0b866a91a932786d638034757255dabbc62249252ea889390abdcca64f0a15899a02539285d670194825272c930b9ddb4fc96371416501fee818ee25889888220d700000090f88e83095eb8850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000006740f139b83104ec1a04a948507f7f49cc96104846eb3041b2b83516201e1951e8d6d560bdbdf92bc1ba06f81b72afa4551243c1c7ec3eab6d7c52478e2a9f30bc1b93a61f562170d2fb200000178f90175578501e36428ca830f424094dcb58e26413f087312c2be7d8c1b8b10f90b6c5f87753d533d968000b901042a986e340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000753d533d968000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000003f616c656f3171766a357361726a65647570673735676b6a7436637274337338716d7038306377327539377170683775706178796871767667713279373874390083104ec1a013633d63e334661c6c78939fd7ba4c824a0a5d5f3309c5d5211ebb79e204f381a032c79737b9321aeb5bef0890dc58cddf208aa51365121d440504a95500862fb900000071f86f058501e36428ca825208944eaf936c172b5e5511959167e8ab4f7031113ca388059ed95aae08a5368083104ec1a04132abc0724aaa8c17528876a63be5df2183c52f86a25e275f4bc2d39dcdc5b4a0494a4eae98b0132378ff74f1109d77ea67eef5214a9463a2bbf3bf7fc827bb6300000090f88e83095eb9850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000005ce0f8e4d83104ec1a0dc27787a41a980e88b835b7f342ee519de3dd9a8aa070021eb9204be186756b9a04dab18c0464b0661715c8d9799234d0864a214dd0cc32128b8e2306cda8e7c510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195a0e00000000002e08c80000000065d38da9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08c90000000065d38dd0000000000000000000000000000000000000000000000000000000000000000000000000009896800005000000000000002e08ca0000000065d38dd7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08cb0000000065d38de0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08cc0000000065d38df5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08cd0000000065d38df8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08ce0000000065d38e13000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08cf0000000065d38e1f000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e08d00000000065d38e26000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08d10000000065d38e32000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08d20000000065d38e47000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08d30000000065d38e59000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08d40000000065d38e62000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08d50000000065d38e65000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000072f87082605b85174876e800825208944c5fd58936784774eb781b0ee72a828a86031640872386f26fc100008083104ec2a0e8214c0fd23f7a7b86ced35d7e9639e38e8824033bc52a84a861d91a88c9eca8a0248bab86bbfb2007e15f427219cef2dabad0967fef9de1f01eb37b2facdf5ecd00000132f9012f82acd885024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027a1000000000000000000000000000000000000000000000000007a775a2eaa833a00000000000000000000000000000000000000000000000000000003dde9f800000000000000000000000000000000000000000000000000000000000000001083104ec1a0bbefba2e763e9da1411ab9482a7c8922608227d34d500ef6980f14693282544ea025d21bf0119f736efab8058aad833e52cf572edb0886b614ea265c30edaf91b100000132f9012f82acd985024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027e90000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000003e43a03e000000000000000000000000000000000000000000000000000000000000001083104ec1a0f96303e235e28696911b9cbbec70cafb130aa4687f9641b256fda618e12bdb8da0600580c1922f4ff2569f5f12a5516cb7c6d67b9b5fcd81eaaa52fbc71a34368600000132f9012f82acda85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000280c0000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000000e111300000000000000000000000000000000000000000000000000000000000000001083104ec2a0050135c9bb5868b1071104d3d5f67b74e561b3e2af1ce68272270371cc90e891a069bb88ffb9442a7bd17fdb0ba982d2343a32ac29a3b3b3dc8d7b0615f0ae4e8000000132f9012f82acdb85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027b10000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000056840a09a000000000000000000000000000000000000000000000000000000000000001083104ec1a0c3e0a60a075f727f110d185b85f3dd8c7df9d9b6d417cd3cfba1cffa79b0525fa01cf73c4bccaf428ef66c8f08521a1b4684b305c092471cf6c2e138783a82303500000132f9012f82acdc85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027ec0000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000008caabe00000000000000000000000000000000000000000000000000000000000000001083104ec1a00c59f5736a8619e2aa98be5a112b1ab190712911a4a43fd0af9b946ac726c7e7a00b46e9927c95ea8ab1cc349e8567da5be7d569d029e8e7470b854c29d2c7c93100000090f88e83095eba850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000582d215e083104ec2a0ec6aae249e321655361487aa21aaf71fd99e20adc17af90fda247a5ad952b185a06bf139de79a71598af69b6c2352058719dcda98ed1399ab660aa6360df7f06eb000002d3f902d0823b508501e36428ca8307a12094917f3e5946bf84e8cf54e4efd00cf5748b34237680b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000049e5f86ded0f3bf109439689fab8d0de0003b3ad0402000301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000043bcf169ca00000000000000000000000000000000000000000000000000000043bf0ae0d000000000000000000000000000000000000000000000000000000043bf0ae0d000000000000000000000000000000000000000000000000000000043c40d13000000000000000000000000000000000000000000000000000000000000000002c48de2c7c3be5f97d45f4aab21e615645080c672bf5b821c3786d928de16f1ab366ed40516977fefa539dfb9e1eb2754307ff98997a3206ec18227df546f20760000000000000000000000000000000000000000000000000000000000000002109e6c708122074988608fdb7fd8b973d6306c5697d7533df48151e757661f3722a3cf95187f2ec13e2ee4f67be648bbe949518abef6e2bab1eb9a90f032072483104ec1a014234d252de2ae2204427f3e94a054c1944e46a3df256d31ee9cd1f0a288f342a03db34d53d1623c3339e439c2c433e2c4d48e2a0a23469b430e2172c6e50c4db500000173f901708207bc85025c3d32fc83015f2394a38c2b5408eb1dceedbec5d61bed580589c6e71780b901040000008200000000000000000000000000000000000000000000000534ca5face53480000000000000000000000000000000000000000000000000000000000065d38d640000000000000000000000000000000000000000000000000000000000000060baa6fdb919c9b7f0988a0ce25ac1a1643b6525d0f72b75d6e7501ca1a83f0486000000000000000000000000637052ec2c92802a424d3647149b99ea97ee347d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030c5c75000000000000000000000000000000000000000000000000000000000083104ec1a030577022ef594746076bfffc5298ce10cf3414196ffff6e514f13c0097c2f52ba02312d3b33478f8c937d00f118bf993dec21e1c8c0a559d5faa012cc13335c383000000f0f8ee82041f8501e36428ca829f4894b3a97684eb67182baa7994b226e6315196d8b36480b884994948fd00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f75e553fbe0dc1bbd9efd21cc4408e91bf9486b1000000000000000000000000000000000000000000000000016345785d8a000083104ec1a0e39bee384840e13f1b734f679392f657018c9a039cd97b103d8a22039bade685a010ee03b9e52ff8fdd631c6d003ac4722c10c84329e569b675bd383cf274f973800000090f88e83095ebb850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000005335bdb6b83104ec1a08f4e6fc381c41ffe67506a9e116e5b8e480b2976c950273a177091244756e7a3a02ca25aeca35e728593530fd227baceeac6299b65e62d4835ea41eb0f3b2907a6000000b1f8af8291048501e36428ca8301bfff942508f26127313db871b9294165f58feb9fd1a7a680b84417835d1c00000000000000000000000000000000002c76da000003e8000003e8031875ba0000000000000000000000000000000000000000000000000000000065d38e1383104ec2a061310bbcdd115f5fcd3b1c7ef0d8638f695f7d2a3dc7b8b2880a6d44607b71b1a0656fa0fbc5393c4f51da6e431ebb802fa34667beec7b1de61550017933ec96bb00000291f9028e158501e36428ca8304e31f94bbad0e891922a8a4a7e9c39d4cc0559117016fec80b90224ac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a40c49ccbe00000000000000000000000000000000000000000000000000000000000254b5000000000000000000000000000000000000000000000000a7912ede44c9bdbc0000000000000000000000000000000000000000000003034c8a5b22040434f40000000000000000000000000000000000000000000000000022a0a8669f02030000000000000000000000000000000000000000000000000000000065d38f24000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f786500000000000000000000000000000000000000000000000000000000000254b50000000000000000000000000815bec0de3f12ee8bbc7525bc3c3188e1b9d59300000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000083104ec1a09ab2ffd3d217ae34677d5af7823d0884628061c5adeb533ccf0b74304d46228fa05782c1b3b74eb37cbfda4c01030914f939662c5bac901c76f415dc8e66da7fc500000090f88e83095ebc850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004e4292b2a83104ec2a050ffda899791bd40dc372236190e2e3786bc9c3e4fca8ffbef8e6f6867cdca31a034635bd4f2c18cc31b4bb5156b92e3662281aa1ef4c0781dcff75edc82667563000002d3f902d0823b6e8501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b23903020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004b8ee227a76000000000000000000000000000000000000000000000000000004b9644e8516000000000000000000000000000000000000000000000000000004b98e212e00000000000000000000000000000000000000000000000000000004b994170f000000000000000000000000000000000000000000000000000000000000000002a6eca87a16bebd982ff5d3797b8579e682d491a36827ca23e11bef8c35641283bcd32027d9ba36c78bf33a6767274bbc89d4f33fa11f9e7e9599e8b74082b8d600000000000000000000000000000000000000000000000000000000000000024d9bb7f890356ee1d5ae89b80ae916cedd9104f17ce9dfaeacdb5df621d2905c4361affa0ef162e125c968952fd0d2b14dcda26448dea738da139272e23b983f83104ec2a0ca9e51cd707be2dbe6c3132f6535a23e7fc0d7ea49402ece3cb275dc40593b2ba00b1606e416c166f7edf7ca0b4758fa64859cdbd7800a63e9c1c9f1fa83ac2c8f0000008df88b168501e36428ca82a72794530000000000000000000000000000000000000480a42e1a7d4d000000000000000000000000000000000000000000000000002386f26fc0ffff83104ec1a03d891006607009f1a3e59703f082fbf85feaf0bf447e94d072cd180002a38af7a039e20c2406a510739af68c6ab8c23ba532613f63d7608129a9c984020e0c964b00000090f88e83095ebd850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000049ab21c0483104ec2a080fe011eba2477490f88f7e195c2a403c25c8add23748d603aa1f468ca997ae2a06a1f4ec52b952e78a1e82fcfa76d2da1be87efe33bfa555c11ac84ed2fb3fc7000000090f88e83095ebe850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000052e0683ce83104ec2a0cfe45c42a2366220055c653998668efba72d020ded987dc81344588d5d503a46a01045369d1235a31ced0ef38d5fb9c3b954240e49752f412a65b5bbcae259a409000000b1f8af827de88501e36428ca8301a0f6946f1da9076f36000d5f9decdebd52402b1410b2c580b844468021b70000000000000000000000008b38e245c3dfa1ce036731f05af94e24b50f3c8f000000000000000000000000000000000000000000000000000000000000000083104ec2a0e720d4ae2f084c988f22870e10bd3df11812c45be4e38511e15e0c02500d9e88a0649233f964f3e50aa5d19f1b837249846c3cc967cdea3a220d968490e0bfb1760000000000000000000000000000000000000000000000000000000000000000000000000f320e00000000002e08d60000000065d38e89000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08d70000000065d38e90000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e08d80000000065d38ea5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08d90000000065d38eab000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08da0000000065d38eb7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08db0000000065d38ebd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08dc0000000065d38ef6000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000002e08dd0000000065d38f11000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08de0000000065d38f17000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08df0000000065d38f20000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e00000000065d38f2c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e10000000065d38f48000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e20000000065d38f51000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e30000000065d38f5d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000090f88e83095ebf850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004b9980ff083104ec2a0697a4aaa399985973e586c32551d8dc55e01156fbfcc767dbc472d6f93679d9fa024fdf9cbb9dabebedb87a5966c3097bd5dc123fdef0fa9286ecb2d3878d927a700000072f87082605c85174876e8008252089436f7056d1f46509952065a599cc1ff4e7176b0e8872386f26fc100008083104ec1a04c166889902e4cd8a5d38b6c78eb18a17f79d3c2be6394d0ed362b492931b080a0564768b6be22620b77c35e423e9986670f7f1e8ad4305f4a5417d986b3dd381700000073f8718227b98501e36428ca830186a094f433434b7f5aeb00695f84241d48d3c67d8f19bd87038d7ea4c680008083104ec1a0f954b22faddc89fec56fb308c748c01a66b7b240d7e40def184293b756d62c2ca04f2b157d7dfc094358be92c1dc88d710bc950ebec2da543b7ad9a0cea77d3005000000b0f8ae827de98501e36428ca82f9d9946f1da9076f36000d5f9decdebd52402b1410b2c580b844468021b7000000000000000000000000f433434b7f5aeb00695f84241d48d3c67d8f19bd000000000000000000000000000000000000000000000000000000000000000083104ec1a0a70ef1d6a32dee067ae7d5cd3a4aef696fc5a367e079c0941c40537f46b25a03a007029a51a9478980712a50ccfaf47de9e0e96c925cc570f40ffce02c340f6f5a00000073f8718227ba8501e36428ca830186a094ccbabdc2215fc5a34b81316822f1d164d161f8f387038d7ea4c680008083104ec2a0d5394612dacd9dc892051e8c61ff0409f274c32530dfebd9c7a23111ee159594a01b73a4a25ad4e736c4fb9bae230ec03718da68df20c34433e5a6267bc240f699000001d2f901cf81ac8501e36428ca830311d7949e4660807889622acace89cd8445e367703a2b4280b90164cb6e6ef63566373231313361666163393436316161386336386662343762363034643830000000000000000000000000c629fa8b87ad97e92c448e56df9d979e1d1f441f0000000000000000000000000000000000000000058569cc491bd36692e0000000000000000000000000000000000000000000000000000029a2241af62c000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000029a2241af62c000083104ec2a051dd300e3a164b6daa63d120bde70d6049d8d1e6715f729e6ad316999f412b48a036b214d1c1fc0c989ef6bfa38f2062ccfabc8b49cb00a957c4ea215c8ee0849a00000090f88e83095ec0850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000544ee9f9b83104ec2a0469b8673ef0b0fcd6c80f46ea1ad310f1debc1bb6217f2d3f95787df71b8cef8a041403731e3c74f9402cbc38ec240da70b51128cf7b82e1acc9acd1901539e0e100000132f9012f82acdd85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027a1000000000000000000000000000000000000000000000000007a2aee7691eb7300000000000000000000000000000000000000000000000000000004a3e59000000000000000000000000000000000000000000000000000000000000000001083104ec1a0d00e198e118a6742465892d21ff3222da1ce63eaf8116e9e7d7beea1bbe4b49ba00888bcb383e7dda2e94ffc5b4c4bcdd8b112a1df044ecd71588c378508ccc5e800000132f9012f82acde85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028070000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000000a4824200000000000000000000000000000000000000000000000000000000000000001083104ec1a0da2c21cbd6dd1d6fe0535e7106ccecddff3e8c90cd76106fda7688ce11744167a0144b6b2e34666b440d1b4c5851f08c7b76ce80a28c802638bb669f6f3ae341b700000073f871822c6785024411ca8c830f424094f4d9629af20dbc03d8c1ebb79cfbbafca709ef2a88016345785d8a00008083104ec2a0750f98b21080556831cfabc56d11bec57bae1948476dbbde8f64a692d6a273ed9fe7bf713dc768c2403477d006dac9fec6119c3ff679c3e85b2d42a89a20fbdb00000074f872808501e36428ca82ca909453000000000000000000000000000000000000048757c084e5f3c00084d0e30db083104ec1a05e0f3389e00cb6464b691ced0e1e265f516d0205871c3b88317221970372cc54a07c1d949bde5fe62e0324e9c2717f948058bae36356e9e7ec50aa531311a59ba900000072f87082605d85174876e80082520894b2979f6a35f4e127ff92d5be185a641b34882626872386f26fc100008083104ec2a015783f5d3238ab5e2a68ddd1b73d02b5a2460aca08efbf9ec2daa2d23adf5e42a043790cddfb7f1981d3beb431a596683e67dfe2fbbd57b6b43e73bc3550d6522700000090f88e83095ec1850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004dc58c0bf83104ec1a0ad7dbb5642815660e2ed005d6e4df28aabb7cf7aa352e34cf5d411ba58dcaa45a026dc757a8ef033aadddf8a53172db170e9861bb4631ab8bdfdd73c5047487f21000000aef8ac018501e36428ca82b4cc94530000000000000000000000000000000000000480b844095ea7b300000000000000000000000017afd0263d6909ba1f9a8eac697f76532365fb950000000000000000000000000000000000000000000000000057c084e5f3c00083104ec1a0bcd17a46a7396ee809f2fc92d39ca7ccc3dccb6eb11a13304f90498ba7beda11a065a1ab5f65e9ea09a8461e74bcd0e3a4c1c89dfc23ce73847ff6ba18fed3af6000000090f88e83095ec2850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000047c30773183104ec2a0f09a465db2c783b9c332daad4f29fb738e8a82a0feca86eabf0611894b3de66ca075f45189e819674f1e4ef29af4f864de347f57a4dd5f86960c33ca890b575c7400000090f88e83095ec3850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000050b90b6b983104ec2a0919f4257e13c14849ef2daad210877cffa43726054699b774a4acc6d69311aeea06459bac9f11fa60f30099709683f97c7cf24e1e5e61e73a74965fe4036bd1b2c00000090f88e83095ec4850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004bad62cff83104ec1a0655913476335c66dd0346fa06549d10fe0c438e19e270991696a35109077a77fa03fba33a0981caa9ca320135eee74769de161330001482d24866330e37a1fa1a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000173e0c00000000002e08e40000000065d38f6c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e50000000065d38f84000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e60000000065d38f90000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e70000000065d38f9f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e80000000065d38fa9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08e90000000065d38fac000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08ea0000000065d38fc1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08eb0000000065d38fc7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08ec0000000065d38fd4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08ed0000000065d38fec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08ee0000000065d38ff2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08ef0000000065d3900a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000002d3f902d0823b518501e36428ca8307a12094917f3e5946bf84e8cf54e4efd00cf5748b34237680b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000049e5f86ded0f3bf109439689fab8d0de0003b3b3040200030100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000004415aa7c930000000000000000000000000000000000000000000000000000004418774c390000000000000000000000000000000000000000000000000000004418774c390000000000000000000000000000000000000000000000000000004418fcd94000000000000000000000000000000000000000000000000000000000000000029e0d92806deebb2914cb5e5dc2b5588f84dd47fdcf134aa5ff9b893d21d59cb10696aa542caa238f1d835936e3e2308c8f13baea651865b8f49b9c22516d271f00000000000000000000000000000000000000000000000000000000000000026feef1c48842769771fbb62d466c64619911e3950a6060327a5693e31092d2bd3de755ab0c06602379a35bcac9aeb8f0bfc4045a59099d6493240b96ec25dc8783104ec2a0a10f1d0393f96ea7169ffde5c31035b1b5d582d0b8615ea93fd0ed2817a8a57da002120b060a3a65ac912de1d102906a12c021c21ab26581e2f107e3da048c516000000090f88e83095ec5850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000051766720483104ec1a0edf42c0bad043adf9b65f14cfe68ab172c6832225bbda56c4b5e5bdc718ae386a03f2912241160726f6dc07aa654bec6fd48f6594253de33a39a3ae9e15a20288400000118f90115808501e36428ca8303970f94ba50f5340fb9f3bd074bd638c9be13ecb36e603d88013fbe85edc90000b8a4b2267a7b0000000000000000000000001e42d0891a7328b650e9aebca35c135cc1693ee1000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a0104ea7351f278dfcc3b66d6872728fe4f3556c836d0d546838a59e323b6f55d5a0376ab1b25403e1a397be9712b634cef059380e0cad64b720976b2fea9629eb45000002d3f902d0823a218501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b23e06020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004ba25be74e8000000000000000000000000000000000000000000000000000004baeea92b73000000000000000000000000000000000000000000000000000004bb58ab0b40000000000000000000000000000000000000000000000000000004bb76e3400000000000000000000000000000000000000000000000000000000000000000026b2a9bcf82852493395492ec6190b0b683e582cae893c5b13457e1d5638dc12261e4c6d3d2d7b77b6413c36936d9e301a717dbb2f4c32bb4917609a7b7ad0dc0000000000000000000000000000000000000000000000000000000000000000201e0eeb368a3ff106da8367a7233ef5bf229a2284e261afd4d142f77a343135604ffcc9b22ea9cbba195731e5adfcbe96003c172fe1ea7b02f0760e42367960283104ec1a0d0b5dd97edf8b8d8ea28506cd8606327dc41c4573226d58ae08a5c3c63643d29a034489b3854bf5766f8e968d6cde2903ca0694a0fa5e75b8ab3b010ec9c03bc3b000002d3f902d0823b6f8501e36428ca8307a120945ed6390a45ea1a6a63013caedc0f0d2baf67fc3c80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000200000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cab70a5dff6b87a6b89050b9ac72088f0003b3110602000103000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000772cc5f300000000000000000000000000000000000000000000000000000000775a40ac00000000000000000000000000000000000000000000000000000000775acfe100000000000000000000000000000000000000000000000000000000775acfe100000000000000000000000000000000000000000000000000000000000000028d1444b61d29fefa7e07d9371612eea94cd81005f72802ed56ae9bbb2825b1e0890f927995d97b97694f48fd7f1bad7d4abb09a8680918adb99ca100e81ff66c00000000000000000000000000000000000000000000000000000000000000021d7180c5e68bc437e07f045764fc7578fbde2e1e285cbe15c2f2303241f172b239624c6001e80ca655d9c9bf7a68771fd7420dfc031aaf0fac44801fb93c5ea583104ec2a01ccf5bab72df95040e40cb3f638c77908f8aba29373b8e7cd35b612488f5f79fa010c42cb4a638f9b49ee3033ec4fd86655075f0eb76fa721b0289ac08918218b3000000b1f8af8291058501e36428ca8301bfff942508f26127313db871b9294165f58feb9fd1a7a680b84417835d1c00000000000000000000000000000000002cb5f0000003e8000003e8031a6da20000000000000000000000000000000000000000000000000000000065d38fa983104ec2a029650fd48127a23a785350843dc22ce0ebad793555bae0251ae5248600d23312a038ad7480f0fca02b4b4aa5cd60ad8363e752fcf7973256cce3c336fecff32e2700000090f88e83095ec6850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004c403be7c83104ec1a03e3876198742dc043d14cf2328cf9b12836945f60930d5fe5ca00c95dcab0a6ba01821953f5191c5e178f548e960bc385ccd5658062d6de76151cb57b6ab258888000002d8f902d5178501e36428ca830a18be94bbad0e891922a8a4a7e9c39d4cc0559117016fec870b4e8cbdc302b6b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001648831645600000000000000000000000047854ece53d37ffbb6eb65877ff364bc98013d7000000000000000000000000053000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000002710fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2766000000000000000000000000000000000000000000000000000000000000d89a00000000000000000000000000000000000000000000000fb88ef7839f46e847e000000000000000000000000000000000000000000000000000b4e8cbdc302b60000000000000000000000000000000000000000000000fae88de493d0aa2eed000000000000000000000000000000000000000000000000000b474de86fd90d0000000000000000000000000815bec0de3f12ee8bbc7525bc3c3188e1b9d5930000000000000000000000000000000000000000000000000000000065d390d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a012a7efa8c33d92d5b6c62892d5038e9ff8a56a83fcca78dc08a7e2a675e13274a00dcd2dee7cbca4c55bd4b494474d02db594a6a5b5a71bb32c6431390e339c34600000090f88e83095ec7850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004751c680683104ec2a0cd7b89e7c8ee3c3ea98985eb1731ff0c332a9c8be3a36090aa4e3ec8d35b09e0a0674fda09f9328282b39cee60a20f941eab76382b0a7c5a8be3d58e7a2fb11eee00000211f9020e028501e36428ca830291ae9417afd0263d6909ba1f9a8eac697f76532365fb9580b901a45ae401dc0000000000000000000000000000000000000000000000000000000065d390f300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000853151a55a64182ab87e53629d0a27246b867d2a0000000000000000000000000000000000000000000000000057c084e5f3c0000000000000000000000000000000000000000000000000507ebb1edd24f708f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a02268e50041782673043953f3071101e93d18a4dc1920031870f1607ef28ffebfa006865aa2d740e01f2f242a48cb5c8fa906abe7e2e9dc359c28f225c828925cc900000090f88e83095ec8850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004b3662ee283104ec1a029f7862b4eeb612ff989c59cad073babf2d98634df1b667caa1a98282b8f9a9ca02ddcde52deac3399ee7b54ac6a8265f2bbfa45ccefed84ea7d7406ca1b859f0d000002d2f902cf823a228501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b24004020300010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004bc410231e0000000000000000000000000000000000000000000000000000004bc88853fc4000000000000000000000000000000000000000000000000000004bce86fbe00000000000000000000000000000000000000000000000000000004bd2f20aa800000000000000000000000000000000000000000000000000000000000000002d08e5c687ae6c257a88dcb84a1d9890b56641bab97cc37aee856ded8f3da2e40d0e85cbb3e2d1fcd9c60bd8f8cba0f424595fca3700d575a374b4c6a56f7993f000000000000000000000000000000000000000000000000000000000000000279ded0fd9af98e708cd6ac3841282db13c60997a83139831322f2ac46bd02b893d5a3c1d5a031c25803ab32517bef6782726dfbbdd31bab70e2a20b34431338483104ec1a0b1a2eb5742b71da63eb2408f161efde17d17e9d4868ed5c7a09d0fd31ca825019fbc02afdc801daaec9d53535aff2ed2617eaee13ad8fd54aba017684b8030f600000000000000000000000000000000000000000000000000000000000000002f8b0b00000000002e08f00000000065d39010000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08f10000000065d39026000000000000000000000000000000000000000000000000000000000000000000000000009896800005000000000000002e08f20000000065d39041000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08f30000000065d3904d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e08f40000000065d39066000000000000000000000000000000000000000000000000000000000000000000000000009896800002000200000000002e08f50000000065d39075000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08f60000000065d39099000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08f70000000065d3909c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08f80000000065d390ae000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000002e08f90000000065d390b2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08fa0000000065d390cd0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000002d3f902d0823a238501e36428ca8307a12094917f3e5946bf84e8cf54e4efd00cf5748b34237680b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000020001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000049e5f86ded0f3bf109439689fab8d0de0003b3b6010200030100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000004469604c3f00000000000000000000000000000000000000000000000000000044736d026000000000000000000000000000000000000000000000000000000044736d026000000000000000000000000000000000000000000000000000000044756f3b00000000000000000000000000000000000000000000000000000000000000000298982789ee39041e612e1758ebb0028dcb2cb82940be553d9584f26740bd9bb5a9efd4b8ba73bb0ce67377133f78feb9becfcc74691ae8ee96d1d34b2312a55d00000000000000000000000000000000000000000000000000000000000000022165fafa71b8ebd91a65bc20ed46a138232edc400b3dd718604ccd0d6847c516171f1d194edef05d5f6ea4e24ddf15874837ebfe9542b873210c6ea25da172c183104ec1a0647a5cb7c47e177e55458f8bc58e71c847d7805ccbbb1bfa7ce89f5b9cb270eea04c36b9f4c1f58f85447dff4a97252b7e23fc59c9d8fdfd541414684604bbf92600000132f9012f82acdf85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028070000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000008fa5ae80000000000000000000000000000000000000000000000000000000000000001083104ec2a02cd07aa7e8a0e4af78db27a9a1dfd158d9f4d66d1489ced4ed1b9a9fcfe73fa3a0285863b1f7487f05ab3a68dc91ed648d565cad52977c38a5e6f986cf372ffa7f00000132f9012f82ace085024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000280c0000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000000bfb0440000000000000000000000000000000000000000000000000000000000000001083104ec2a0b9e91b376bdb01c12a43d27425b94409f1bdef86a61f5f9e4fec1fcde76d00afa07fb251fb1ac25d942fdf96db4413dc986f58e62f3082a7155e1f13d4f0892f4d00000132f9012f82ace185024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027c5000000000000000000000000000000000000000000000000005bbfcbedd379600000000000000000000000000000000000000000000000000000000002faf080000000000000000000000000000000000000000000000000000000000000001083104ec2a0fc64ad4b584932b3b8a34d4891021326c73a05664b3b36f4f1dc8f7375ab247aa05da67c20907b016ced0fbe974595064a4856814f71c0825f72a3eb659e0ef56a00000132f9012f82ace285024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027b10000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000004af28ae97000000000000000000000000000000000000000000000000000000000000001083104ec2a05e059d14ce3710eb19586e02d1ccd63aa9ce84b46914eea05c74b1482af48ea3a015457f232960c4741561fd0b04193bb666a91fc6719e07ac4761956ce3e4557200000132f9012f82ace385024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027ec0000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000077ce2a80000000000000000000000000000000000000000000000000000000000000001083104ec1a08486e0123e110a57ae9dc6e3bac3acf14c324e932210b1bd0ef31cbfe214edc9a032f1990b2f33ec4e13f1ae04a3cf4f794d0b7b078f5bb9d0d480b03b139160c000000090f88e83095ec9850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004f1f69dc083104ec2a0ea1ec60d5006197e0a48fc98e925def9e26670e1a3ddd7566bb62efd7f04db5aa03dbd489671445b98789e38d681264cf9da50071dcdcf0768db6e53702ebf60cd00000090f88e83095eca850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000554e3d26d83104ec1a0b056d088ecc0d82cccd07de26fba5ebb47a4880c3cc09e650d7d4da46549537fa01ab6101ef79468c9c60a483a22993caaa02c786f44239183b2aa5fea3209560800000cf3f90cf08207bd85025c3d32fc8307b39b94ca11bde05977b3631167028862be2a173976ca1180b90c8482ad56cb0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000067fff0c6abd2a36272870b1e8fe42cc8e8d5ec4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010400000082000000000000000000000000000000000000000000000076e127ef4e511e00000000000000000000000000000000000000000000000000000000000065d38fbc00000000000000000000000000000000000000000000000000000000000000608268019e9ddeea51158045af6f0b35ae4e4db6441e5ac97b474bece983d8d3c90000000000000000000000009bec2a494c0969fa633ac6f6e32f564fd97bc0b4000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030c5cc5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fadf055f6333a4ab435d2d248aee6617345a4782000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104000000820000000000000000000000000000000000000000000000003658bc5585b32b000000000000000000000000000000000000000000000000000000000065d38fbd000000000000000000000000000000000000000000000000000000000000006076abb1df9a5a755eae6f870c399df62f33ea0433859494906b2c008e1df2bb43000000000000000000000000e297afb7bbc23961ce7ad7e15f01b716ebe2f8cf000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030cc5d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001804969b296e89c1ddb1712fa99816446956637e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001040000008200000000000000000000000000000000000000000000000000c85667fee260000000000000000000000000000000000000000000000000000000000065d38fcd0000000000000000000000000000000000000000000000000000000000000060663a751e328a1d433b40f87f1aeb9626d37bbfc9e2a861b6d68e79ced10e0321000000000000000000000000fd500856a57870a208acaab92499eaaa6295dfb9000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030c5cc5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8a1f9461115ef3c1e84da6515a88ea49ca976600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001040000008200000000000000000000000000000000000000000000009ee2af9351ffe400000000000000000000000000000000000000000000000000000000000065d38fbc0000000000000000000000000000000000000000000000000000000000000060ba5f36db1561edda56a7e9e58e4cfe714216824224a214f38b02a595c52e7de70000000000000000000000007fe44bbae0ba869e707bd6030f0c104fee5832e4000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030c5c75000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a53dc5b100f0e4ab593f2d8ecd3c5932ee38215e000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104000000820000000000000000000000000000000000000000000000002f097c4d3ee250de0000000000000000000000000000000000000000000000000000000065d38fbc0000000000000000000000000000000000000000000000000000000000000060cd44b626c199acec0c8fd7085747c972744379a3227f7ae062f5fbf3ba356cda000000000000000000000000eeedf9a993f7bda00e2dcc6c9dd6f8436d58a2f4000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030c75c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee02370bac10b3ac3f2e9eebbf8f3fea1228d263000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104000000820000000000000000000000000000000000000000000000aea5ce2229151e7a4a0000000000000000000000000000000000000000000000000000000065d38fbc0000000000000000000000000000000000000000000000000000000000000060c3231ab28d32c66956d3d78801dbaec719ac8049a05e624c2faa6808efe73946000000000000000000000000b4f4e7fcb24a2c78e2a22d9cae0f4618ee670bfc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030c5cc5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9bb81d3668f03ec9109bbca77d32423deccf9ab000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104000000820000000000000000000000000000000000000000000000b7e45d0df9d705acd00000000000000000000000000000000000000000000000000000000065d38fbc00000000000000000000000000000000000000000000000000000000000000606e5fc786ae1ed2aa4e31d287f82d439b6c8d50b0fa148cf9f1776eb742d49e590000000000000000000000006ca30de62e5087b0b706d6d16c284e0bcd1e11cf000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030c5cc500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a06824e9a90f9344a509eb422f67be3c35dc8ad9191f4ce9abcb9383f458d5a5e2a0544c97d6a550fb47d9e8a78e8fadb7a555c46a2e596ba7e609c7a71f0a26d87c00000090f88e83095ecb850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000004cf384bf983104ec1a06cd748f294fd61d74de30c915e53987dd9ee09596bfa5fb8fba915149d508ee3a03d0dd1900333c77943753a99441ef804ff999b81220be522c30aa6c36c2ffc3a00000af9f90af6808501e36428ca8304cdc8947024030c21aae0e8e9ce9d8c6f23ad024a7d162788016345785d8a0000b90a84a11b119800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001800000000000000000000000005300000000000000000000000000000000000004000000000000000000000000086d8d30822086941729df294f0e52e42edc17f9000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000007739e567b9626ca241bdc5528343f92f7e59af3700000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000004d0e30db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000844ce654c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000053000000000000000000000000000000000000040000000000000000000000001e24b33b51e36f3f2391e7e4b51fdab2e772604300000000000000000000000008f5c28ff0622fef758c2c3c2a5eaeeb63d60d4c000000000000000000000000b299eee0ed46b7a34c01f2a01fc83a0b45aa88af0000000000000000000000001e24b33b51e36f3f2391e7e4b51fdab2e772604300000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000200000000000000000000000000086d8d30822086941729df294f0e52e42edc17f9000000000000000000000000000000000000000000000000000000000000026000000000000000000000000008f5c28ff0622fef758c2c3c2a5eaeeb63d60d4c000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000000640000000000000000000000001e24b33b51e36f3f2391e7e4b51fdab2e772604373796d62696f7369732d746573746e65742d6170700000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000020a121bdfaa7657e94c06b77c7f3eb0aff9751ab00000000000000000000000070470021f81e30497f86962e889bc732ca70aee100000000000000000000000000000000000000000000000000000000000002e41e859a05000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000cc9f8896896c6ef44f2504a6a29e6057adbff1790000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c48f6bdeaa00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000023527431553ccf000000000000000000000000086d8d30822086941729df294f0e52e42edc17f90000000000000000000000000000000000000000000000000000000065dccb0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c44af80948b8a20bb781277559457ce0f2893b8b000000000000000000000000000000000000000000000000000000000000000200000000000000000000000020a121bdfaa7657e94c06b77c7f3eb0aff9751ab00000000000000000000000070470021f81e30497f86962e889bc732ca70aee100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264e66bb5500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000237fe4b2395d470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc9f8896896c6ef44f2504a6a29e6057adbff179000000000000000000000000c9fd2af244fefb31a62a5a33b9d6261cec2cb7aa00000000000000000000000070470021f81e30497f86962e889bc732ca70aee100000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000240000000000000000000000001e24b33b51e36f3f2391e7e4b51fdab2e77260430000000000000000000000007d8b7b5f663e93d7f8970d0a61081af03c63bb860000000000000000000000009f81facae42a7312f49a3e27098fc4d39e2c550d0000000000000000000000001e24b33b51e36f3f2391e7e4b51fdab2e7726043000000000000000000000000000000000000000000000000000000000000000573796d62696f7369732d746573746e65742d617070000000000000000000000000000000000000000000000000000000000000000000000000000000000000447647691d00000000000000000000000000000000000000000000000000237fe4b2395d470000000000000000000000001e24b33b51e36f3f2391e7e4b51fdab2e772604300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a045a4b9735ade732b42e3cedc489c1126c58c3908489a05d6d9220183169ca39ea02b9c54809b74ae5ea8a7ea3e3bd295d519d62146966224ddcdd3d0091e208b9c00000090f88e83095ecc850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000487835a4c83104ec2a04d5533d24c916a45ec56b751c2c1e204556925a4648fcb7fc2f80f980c48fa95a0530608982e184de51ea715c62831a91be96e3e8402d59cf853efb6af5eb40376000000b0f8ae8203e88501e36428ca828082949ad940b25dae3bd975d6ed8892c63d5033ad1e6180b84475edcbe00000000000000000000000000000000000000000000000000000000000000000cfe32d6fd614b6766d245a4ed34a95f2fbd661421d9ccb7b5f39d902dd3f9b5a83104ec1a0639b6d1dc1784d3e77d871c62a210f5121bf15bdabcd33ef9d67c0a175c49418a07bde5528b6a4a1a423152424a7e72e3790f291557ce4d88de008718dacd35323000002d3f902d0823b888501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b24206020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004bb6f4ee179000000000000000000000000000000000000000000000000000004bb8e12eb40000000000000000000000000000000000000000000000000000004bb8e6e78c0000000000000000000000000000000000000000000000000000004bb94b0a5000000000000000000000000000000000000000000000000000000000000000002774a8e4d04db17f63c31246d580f0cd235d5dc3eea4d93de5e403ba1e5e53dd20f5cf9e3962f98819aaec42bbec54ea101b4e9574687d2a31e9d03a0dbcd34e1000000000000000000000000000000000000000000000000000000000000000263b4631075d058beb9465d439635c4ea9f043c534435b3276e213621e8d0acde0d9eb27fdf1a99c44be80437fe52292865d20ae93a1f420f2a74498ca6f7f0d183104ec1a08c8036b99101e41b158ec0ef49218e4ed9033a4ef58d79e76a3f8a18e923d763a04be18c6914e306d52da6abf5b30f1b78c3939cf76e93d9e55600080da4ca0412000002d3f902d0823a248501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b24206020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004bb6f4ee179000000000000000000000000000000000000000000000000000004bb8e12eb40000000000000000000000000000000000000000000000000000004bb8e6e78c0000000000000000000000000000000000000000000000000000004bb94b0a5000000000000000000000000000000000000000000000000000000000000000002774a8e4d04db17f63c31246d580f0cd235d5dc3eea4d93de5e403ba1e5e53dd20f5cf9e3962f98819aaec42bbec54ea101b4e9574687d2a31e9d03a0dbcd34e1000000000000000000000000000000000000000000000000000000000000000263b4631075d058beb9465d439635c4ea9f043c534435b3276e213621e8d0acde0d9eb27fdf1a99c44be80437fe52292865d20ae93a1f420f2a74498ca6f7f0d183104ec1a0fb88313af941edda63ba69a5164e5d92ce70bf46c105df81deaaee68ea8c550fa04045c9c1a201989e9dbec697afa90173034cd53eb63e0d575f3d7445553e5074000002d3f902d0823b708501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b24301030201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004bb778b80c7000000000000000000000000000000000000000000000000000004bb7dd7b2ec000000000000000000000000000000000000000000000000000004bba3d46080000000000000000000000000000000000000000000000000000004bba9c2a060000000000000000000000000000000000000000000000000000000000000000277a27ac96fdee82de316067037886330013dd23a04ed082810852ab30db7f991dde163ae7d9f0754eb3149ec0042c5728700f4ecd962d0cbebb8553cfb98c7fc00000000000000000000000000000000000000000000000000000000000000026efa901d7bbfdd0bc546826d91cb29f038006c0f24fe6c960ad9537e88e2ea0824b4fe023ed4498d7a0f94b5059fe12c31d196cab9f804249ac03d8439b6a68d83104ec2a05c1aee58a55bb0a78161badef33ef860bc375604564bcb23c86d5adb5a960e19a0075be99fc3923194c377d0ccb4477fbc9ffb876397357ef0c957a327b133414400000090f88e83095ecd850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000041f305c0683104ec1a0ebfa984c6ec1c3b45ca4dbf43f07b4907a4d7f2998acf7a29e5bfcf5cc3eb71ea0570c5e83af4639f2049977620efdd75e47b42f4075194d5da253c869446ab4d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a71100000000002e08fb0000000065d390e2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08fc0000000065d390eb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08fd0000000065d390f4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08fe0000000065d39109000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e08ff0000000065d39112000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09000000000065d39131000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09010000000065d3914f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09020000000065d39152000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09030000000065d39155000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e09040000000065d39158000000000000000000000000000000000000000000000000000000000000000000000000009896800003000000000000002e09050000000065d39170000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09060000000065d39182000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09070000000065d3919a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09080000000065d3919d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09090000000065d391a9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e090a0000000065d391b5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e090b0000000065d391bf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000090f88e83095ece850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000477a083dd83104ec2a0855dbac8a9cc0b12d1c49cc05249df505f8dba61c6c71c08062db5a796067042a05d2ce5cdddf13ed920353d5cdda4db9bcaeae82a85c9edbb83595dae66ffbd5900000090f88e83095ecf850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000042e9ef9cc83104ec1a0ebcb39ef90fed43e1416826a5df93e4cfc0ed7f2fcc2ea3e6803b36ee74bbad5a033d844e5ef45975575a08edc4635636251416b27c83a9cf7b1a77a2836eba80f00000118f90115028501e36428ca83037f0894ba50f5340fb9f3bd074bd638c9be13ecb36e603d8803311fc80a570000b8a4b2267a7b00000000000000000000000089d4e73c57c37343462f615856ffc94dcb5ab6c600000000000000000000000000000000000000000000000003311fc80a57000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a01d78e99d74b32b75fbbe66f458a10c95663206486628ff9aae4ef3ef12efe1c9a027d1f74bae5cb8be2dcdb3ffb48beac93458945e863275477e97ed9a262cd97900000090f88e83095ed0850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000003ecd4dccc83104ec2a0af12c3063a1b8262ec433fa370838b32f8cb4635f137c23f29d1effbffd96b44a021a1d3efbb76179d242fedd170444a809c68f5012df687f1bba22cefe862cfc700000df5f90df2038501e36428ca830c9a178080b90d9c6080604052678ac7230489e8000060025534801561001c57600080fd5b506002546000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610d2b806100716000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461013457806370a082311461015257806395d89b4114610182578063a9059cbb146101a0578063dd62ed3e146101d057610093565b806306fdde0314610098578063095ea7b3146100b657806318160ddd146100e657806323b872dd14610104575b600080fd5b6100a0610200565b6040516100ad9190610a0c565b60405180910390f35b6100d060048036038101906100cb9190610ac7565b610239565b6040516100dd9190610b22565b60405180910390f35b6100ee61032b565b6040516100fb9190610b4c565b60405180910390f35b61011e60048036038101906101199190610b67565b610335565b60405161012b9190610b22565b60405180910390f35b61013c61069b565b6040516101499190610bd6565b60405180910390f35b61016c60048036038101906101679190610bf1565b6106a0565b6040516101799190610b4c565b60405180910390f35b61018a6106e8565b6040516101979190610a0c565b60405180910390f35b6101ba60048036038101906101b59190610ac7565b610721565b6040516101c79190610b22565b60405180910390f35b6101ea60048036038101906101e59190610c1e565b6108f5565b6040516101f79190610b4c565b60405180910390f35b6040518060400160405280600581526020017f6e6f55534400000000000000000000000000000000000000000000000000000081525081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516103199190610b4c565b60405180910390a36001905092915050565b6000600254905090565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561038257600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561040b57600080fd5b816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546104559190610c8d565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461051f9190610c8d565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546105e99190610cc1565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106889190610b4c565b60405180910390a3600190509392505050565b600681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040518060400160405280600481526020017f6e5553440000000000000000000000000000000000000000000000000000000081525081565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561076e57600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107b89190610c8d565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108449190610cc1565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108e39190610b4c565b60405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156109b657808201518184015260208101905061099b565b60008484015250505050565b6000601f19601f8301169050919050565b60006109de8261097c565b6109e88185610987565b93506109f8818560208601610998565b610a01816109c2565b840191505092915050565b60006020820190508181036000830152610a2681846109d3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a5e82610a33565b9050919050565b610a6e81610a53565b8114610a7957600080fd5b50565b600081359050610a8b81610a65565b92915050565b6000819050919050565b610aa481610a91565b8114610aaf57600080fd5b50565b600081359050610ac181610a9b565b92915050565b60008060408385031215610ade57610add610a2e565b5b6000610aec85828601610a7c565b9250506020610afd85828601610ab2565b9150509250929050565b60008115159050919050565b610b1c81610b07565b82525050565b6000602082019050610b376000830184610b13565b92915050565b610b4681610a91565b82525050565b6000602082019050610b616000830184610b3d565b92915050565b600080600060608486031215610b8057610b7f610a2e565b5b6000610b8e86828701610a7c565b9350506020610b9f86828701610a7c565b9250506040610bb086828701610ab2565b9150509250925092565b600060ff82169050919050565b610bd081610bba565b82525050565b6000602082019050610beb6000830184610bc7565b92915050565b600060208284031215610c0757610c06610a2e565b5b6000610c1584828501610a7c565b91505092915050565b60008060408385031215610c3557610c34610a2e565b5b6000610c4385828601610a7c565b9250506020610c5485828601610a7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c9882610a91565b9150610ca383610a91565b9250828203905081811115610cbb57610cba610c5e565b5b92915050565b6000610ccc82610a91565b9150610cd783610a91565b9250828201905080821115610cef57610cee610c5e565b5b9291505056fea264697066735822122062c5d705a7f338e6087523e87734ea252d47734f9b50b533b2e8833d98b3e77a64736f6c6343000812003383104ec2a039da11a0aaf4f4585f9ce239e5ca1362ddd4e6baf8e8858086770c4ec245630da0572f594ed38c7709a7f01ca8693b626406b4fd490e10edd8a697d5ced072811200000090f88e83095ed1850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000390cf355c83104ec1a08b957dee21bd779ced6fedc21e849ded553375bc3edad91819a0ccbd3f014455a0626d4e53fef18d142bb73745a017ed38cf5eae61b1f928d9901720fb1d8f644500000090f88e83095ed2850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000003500cc67d83104ec1a0a72b9b6c1c173faca6733817681dbbb29fe8aaf8725eb1e2a887d13439756422a01e93e8d5ca31f836000004499595b99f6223849ba598451a82b302d28a016c2a00000070f86e198501e36428ca825208944eaf936c172b5e5511959167e8ab4f7031113ca38719396991e7e3808083104ec2a0580bd119336b27cfeb305cc2a375318ebb6dcd55e4c11cab62320aadeb89a099a06853b9b69e8732ecb402b8242bb8d20a309e656ba7b77df8560dc2e01078a1b100000132f9012f82ace485024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027ec0000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000054a37b00000000000000000000000000000000000000000000000000000000000000001083104ec2a0ad0cc8ea732b871faac022fad998e98b7f9f2feea322319eabe531636e86ac10a01cb516b3812bbfbbe88cf1283a61d39b74f07001c4bd691900b080ba45d3584800000132f9012f82ace585024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028070000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000006553f100000000000000000000000000000000000000000000000000000000000000001083104ec2a01b86d5fa009c2b233d9141d2412b27655bce897af1382d9e895a79ecb19dcbeba05f29793fbf0fa0ff227f11a8702bb0d77c1be7d4b11d12faf813b3053196255e00000132f9012f82ace685024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027b10000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000350f45a2b000000000000000000000000000000000000000000000000000000000000001083104ec2a066b1492627e3ba73a57141cc1ddd064450b5bf64da445ce6f0a44702157060c3a0578a7a36ba5956a0801fcad00eb98d3e7e68cbeb39ef8ba1785560b7e747e2e500000132f9012f82ace785024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027a10000000000000000000000000000000000000000000000000078d000415b3f7a0000000000000000000000000000000000000000000000000000000363d7f800000000000000000000000000000000000000000000000000000000000000001083104ec1a0c56083823fc55bcaf18c11bdcd19809a17c72e2c08e37fe174e5905f68570237a01eb029cc06831e0fcf3994152fb26978268b7413e1680746cb73d2dcbe3e6bc000000132f9012f82ace885024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000280c0000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000000876bf80000000000000000000000000000000000000000000000000000000000000001083104ec2a0b63bda8e47682db7a0dd16c0932fb46c0ba8b012a367603aa5d2997c5c7fd29da02c5d97c1bafa718071c90003dd9bd31c902aef9f751902c850cd3121422d2262000000aef8ac048501e36428ca82cd11949140ef794cc5f702a85f491bd788cc8d2c8bd02c80b844a9059cbb0000000000000000000000005e809a85aa182a9921edd10a4163745bb3e36284000000000000000000000000000000000000000000000000000000000000007c83104ec1a0da291af76d0f9e77406511e7959057368a29f7b99850fdc50cbba81b8178665da05d013eb42de9a0c69d83879fe7b1799d30a5af1dc77a702c011fd5b7cdc5df40000000b1f8af827dea8501e36428ca8301a0f6946f1da9076f36000d5f9decdebd52402b1410b2c580b844468021b70000000000000000000000000996784858e112e5a69b060c6ab8cf0bc7f33652000000000000000000000000000000000000000000000000000000000000000083104ec1a09946ee6431384c96bd4708d6305c07ba426c0383f2c7630d85f6444f20fd84caa05bb2cf575d794fbcaeebff62e65e9f04cbaa7bcb8ba47623e61e2afe9ac0a2a6000000aef8ac058501e36428ca82b6a2949140ef794cc5f702a85f491bd788cc8d2c8bd02c80b844095ea7b30000000000000000000000005e809a85aa182a9921edd10a4163745bb3e362840000000000000000000000000000000000000000000000008ac7230489e7ff8483104ec1a0f058ec1592c640f2c8fb5c1700fc9b530b3c9d1aaaa56e7300ef7e24433bca43a040093739aa4849ae44cf8da0273b6e6680f32bb990d264e090a837797deeba9300000072f87082605e85174876e800825208943156a12eee486fedd3a45d8662855b0bebb72425872386f26fc100008083104ec2a0624f6a4b2a54cc497e3edbc6b2c2626dd889ab3a37c76ebfb94126db3782487fa03b99e63d31bb02f061e63fd6d17424ab8052f0d712fc98d743b090700e8e1d5b00000090f88e83095ed3850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002fd8d6bce83104ec1a0762c90e78b7c38c9b7c2c988979555acc16393c07b1d1d5cfbf521387f4505b6a014d093e11c769695710d5bd14e11c29d2ee48d942c02667cf586b4389551323900000074f872068501e36428ca82ca9094530000000000000000000000000000000000000487470de4df82000084d0e30db083104ec2a09f767be129bdb8c5c9883df21f24e688a539db7d38a9e6c3d7fea1cbec63adfba0379f0a03b0c0096891c029147de7626be24f8bfe3ffcb0754b955f14a77d499000000090f88e83095ed4850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002b70ba0c383104ec2a0afece324e89a2a740b0338974d49a3218beafe132acedb0a9982df313834123ea066e2737f1717122c98ca8fc7c94de6725fe881c847feb20212a52244f82d88c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fea0b00000000002e090c0000000065d391c2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e090d0000000065d391d1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e090e0000000065d391dd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e090f0000000065d391e0000000000000000000000000000000000000000000000000000000000000000000000000009896800005000400000000002e09100000000065d391f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09110000000065d39205000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09120000000065d39223000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09130000000065d39235000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09140000000065d3925c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09150000000065d3925f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09160000000065d39280000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000333f903308218e68501e36428ca83081170946fa0a77bb9fc5ac9e9d9c26c101067486291d2b580b902c484d61c9700000000000000000000000000000000000000000000000000000000000000600000000000000000000000007739e567b9626ca241bdc5528343f92f7e59af37000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000001a4c23a4c880000000000000000000000000000000000000000000000000000000000000000a6539ed64a1e6b851183dee68a56343d3652df44b7e7018a75d5b88e1f4231d06f1ce17485fc0c13f979650e2a9c34c9f0813c3731bc5125f588c47048b1bddd0000000000000000000000001e24b33b51e36f3f2391e7e4b51fdab2e7726043000000000000000000000000000000000000000000000000011c74cfea6b0ea2000000000000000000000000530000000000000000000000000000000000000400000000000000000000000041151ceffb743650e14425c7749019e491fd19870000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000447647691d000000000000000000000000000000000000000000000000011c74cfea6b0ea20000000000000000000000001e24b33b51e36f3f2391e7e4b51fdab2e7726043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000419ab8c7ae558df36a642d453f57f39088cad48efcfff2d5fe1c8725ef9cf7c95e405bd74d01392b21b4311b422dc4ad2d8347386a3a02a344512637a835a8994d1c0000000000000000000000000000000000000000000000000000000000000083104ec2a0046df0fd5940ebc236537180a1751c78472209be34c035c8c72d608246a48401a03ba2dde68427ccbe613edc0cfbe23ab2f12403931495114658c53ba45f7fef7700000090f88e83095ed5850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000030dd4ff9883104ec2a041d8a675c1a9b84fb6fe118cf2bc9861175de3f6acdf439f2c8770f80b5c362aa0078ef58d8d765c302b6a959b063f7edb227ac14ebd83c0f89556cf99231beeb400000090f88e83095ed6850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000036f8e253c83104ec1a0a44a7dec24247454511290a89e4276b32e3652f1c7d5080e2ca345c2099cb72aa00bfed34131f0bbe620951d3db82fc9d13da2f7b80505b9218946868b261408c8000000aef8ac078501e36428ca82c0c994d9692f1748afee00face2da35242417dd05a861580b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec000000000000000000000000000000000000000000000050935671952c6d0ac383104ec2a03851bb4b2b5da75940897f896cd4601dc0e7cfbf388fa0f93cf7ef9a30f0c6d3a061eac6d7f10ecc19f42cfe3e4053eb7a5d72736436d047335164b327f3b3695e000002d8f902d5088501e36428ca8308c96d94bbad0e891922a8a4a7e9c39d4cc0559117016fec8724c116e24162d8b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000001ad9c000000000000000000000000000000000000000000000000000000000001ae8c0000000000000000000000000000000000000000000000000024c116e24162d800000000000000000000000000000000000000000000001a5d8cc3cf4dcc85a00000000000000000000000000000000000000000000000000017242f34b6343300000000000000000000000000000000000000000000000dc4397ad017d92cb4000000000000000000000000853151a55a64182ab87e53629d0a27246b867d2a0000000000000000000000000000000000000000000000000000000065d3930c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a0ccd8dce6af873bb97e2270326ec41948dcfd3864d52170a27258f96f03a72ad4a07c0d304d9c976b754d3d96e6dc52dbb248a53e9ac091038be7f31bafa69b993500000072f87082605f85174876e80082520894515c3fc211f1709c00034ccd338c2d6f11b0b9ea872386f26fc100008083104ec1a0d8c0b1307695e9a3bbd36da4c31f91d4e7dab387a4b6b09cdd6b431f34fa39b9a0073dd4ec61cc96406d6b9b9537935b900843d4090bd951fc78bb850fc3dd683e00000218f90215098501e36428ca830296d79417afd0263d6909ba1f9a8eac697f76532365fb9587038d7ea4c68000b901a45ae401dc0000000000000000000000000000000000000000000000000000000065d3933100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000002710000000000000000000000000853151a55a64182ab87e53629d0a27246b867d2a00000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000000000000000000000000034259abcb9f19cfae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a06fb41bc0b7da9c988c793a35010e0f2765cb1b7ca7955322ea69d18aa969cca8a06cd9bf38e19d5405a3993d70742c4ecc536fc8eadc98dabc6c108b3dfcb10ee400000090f88e83095ed7850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000034385d23483104ec1a083544a9e0dbd93ac12386caca57644f9f1c35fa4c4a613bc8e4685b6c0ee2a9da009f3b904fe751bbb869799827f54c968d11a09f6dbe1134610f30bef5dc890ed00000074f872822c6885024411ca8c830f4240947a0222dee3519854468f31154a4349c92814875f88016345785d8a00008083104ec2a06416797680e1adbbaa35f183cc7ddfa2f61d5086dfb34f5f55cad428eb9ba067a037cd782892cbcdbc5240e9b853f39d3efc67c03ff4f82186e481d2bd584a5dfd00000090f88e83095ed8850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000309f3b03883104ec1a0039eba6d285029c490ce4f4ab5a5c503f3cdcb3d4630729286fcbee402ca4559a012e354d003a52f2907e260b0bba6902d5c3cba944fe90dca8d35e5288091f2c500000132f9012f82ace985024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028070000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000059682f00000000000000000000000000000000000000000000000000000000000000001083104ec2a015981104c8999cc643fd5bddd6b4f3b7c00dd46a3fae7ae3f85d8a754910d41ba07e0e5d8f6ea700fda5c3f14cff436dff1b2bca16ae0b0249e6d6fbf8b3173be50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026160b00000000002e09170000000065d39283000000000000000000000000000000000000000000000000000000000000000000000000009896800004000000000000002e09180000000065d39292000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09190000000065d392a5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e091a0000000065d392b7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e091b0000000065d392cf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e091c0000000065d392ea000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e091d0000000065d392ff000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e091e0000000065d39305000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e091f0000000065d3931d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e09200000000065d39323000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09210000000065d39363000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000132f9012f82acea85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028050000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000000160af0000000000000000000000000000000000000000000000000000000000000001083104ec1a00d687d24a94272e075d31abeb84eacbe5eccce584f0e03d6431b72624c55d5efa01f57327c4edc894fffbbebe7acb9f56b1d5d68b67383d7d4c829bd729771109500000132f9012f82aceb85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028030000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000000001501d8000000000000000000000000000000000000000000000000000000000000001083104ec1a0dca30142d63f63d2ed1811721b4f74877b1c495b889c7aeee07b9fb376a81acba040f5f9b03d494167db7e58973dd4239f3c56e73be36d25a8282baa3ce234c14000000132f9012f82acec85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000280c0000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000007735940000000000000000000000000000000000000000000000000000000000000001083104ec1a0137593bcc6a604ba26e5f964af8f1a357e1c1aa4af4490ee0297dfb9edd8dab5a044c8ebae5a3022c21b6a7b215af48cf73a6246c859c178d197a2ff14e8a1226800000132f9012f82aced85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027e90000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000003732dbfc000000000000000000000000000000000000000000000000000000000000001083104ec2a022422e83c1adfa635ddd967c6d5058772c1bc1bd3651034da5d317a485a1bda9a06413513aaa8c4f0095aa86ac076aea96214fff8772b815a9d3927acaa357f53100000071f86f168501e36428ca825208945e809a85aa182a9921edd10a4163745bb3e362848806507c16dccd93908083104ec2a0ae33688b3298329fba89edadada18cf708eef12156df476e7eef851cb3ea31cba0412719f039131ae36d97550db05b2dcd65cb113426be1f2bf0ff820333c107fc00000090f88e83095ed9850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002c8b368d683104ec2a03030938632d390c973aa69f1793d35f1b227cba1d51d2d776919a3399a0102f7a01b63df2432f77cef2f8f367cdb49362b3cac8b215217ace6195bac4193392f0800000090f88e83095eda850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000296174c9383104ec2a046875e66f3dbf7532900e31022396c0fa79891ff0ce3cce7f5d25a95f6555921a02c09f26a8726251406af0b184d829d4ab3df8b4b9c2f1a8170b2e82b46b410c3000002d3f902d0823b718501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b24b05020300010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004bcb025fff0000000000000000000000000000000000000000000000000000004bcc6973d62000000000000000000000000000000000000000000000000000004bd1e426dc0000000000000000000000000000000000000000000000000000004bd2597428000000000000000000000000000000000000000000000000000000000000000025d91fc97e49e7701fdd1f7cc9d7ecbfef4958fd777a78b44cc796b160d2d92b8ce14d922331d558133519ab4a70a04ac054630f21166ec2513431245e499767c000000000000000000000000000000000000000000000000000000000000000264c3c95b18fc44ae5020f0605a40443df9c247512e49edeafaa35a10e265b10051c4636862e76195b6079027b8ffac8fa1cbd24bbc584590b3041b17ed4c4c5283104ec2a01bc5d34f841e5b20e90b35eb1247d8c27244992cfc03da5380481453fdf145a7a01c2020538ca312e3ae909dea6004174249a009be68629e685395802f1e6fc4ce00000070f86e1a8501e36428ca825208944eaf936c172b5e5511959167e8ab4f7031113ca3871550f7dca7253f8083104ec1a0cf32c0417d23037bd5fc134eef92e7016c1625a9c26eee13ae70747c633dfd9ea030291e772795a0e9e732e060fff814350d1ffa5e7b7eb6d2f785ce36edfa73d900000090f88e83095edb850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000026227159483104ec1a0988674d62b0c2e8ec91a03005299b26764a96f2b10e1ff6c8079c8e3d276e394a00165f11fae4ecc3cf9f3136b1a797773a113d35ab3e216d261f871ae25d7d98000001453f9145082028a8501e36428ca83039bf894e432150cce91c13a887f7d836923d5597add8e3180b913e409c5eabe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000013a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000008274f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000019be5baf8dfc9e65d967d7799789b77fb17869dd823628c8eb799544ad9b74552000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000013617070726f7665436f6e747261637443616c6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000d294975a1e0994ad2d835c9431ad9cb131fffde6a32fc7a459b896c3fe2631f73dfba019a171a60982bb86bf719fceb18e0f4a40b44a576f276f6bd9c4d987d5357415ffda9d36683ca0b066f2abec52a24b5ef8000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078386137373135663135413439446634623439346330444630333138393965434142326633314235350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000067600000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000033000000000000000000000000033249f556213e290f64cebcca0f4ae59c2d62cc000000000000000000000000081bcea66fe8ca5e09a2d4425103a7804c6c1e270000000000000000000000000b6f38dae6acb217a07bf15f8fe8321537c83f43000000000000000000000000110e75163d776f0005e1448e7dba592ba21ca78300000000000000000000000011fdde73fb55ed8a8bba92f3e9fcb762fa6ba4fe000000000000000000000000190d382a335eb4b0f131324299ff8225c9ae911d0000000000000000000000001e31a5efedc34abd89449e88bb003f26e6decf03000000000000000000000000206b1b84f594df59b9cf23cea94be1178c2048f4000000000000000000000000219cc470e99b70d9111dcfa025ce9a1ea38ed507000000000000000000000000239eb449a60cd10eb265c413e62282820362eea000000000000000000000000023c6efebc5b4d1cc38fc74a4ea96de1703d387d400000000000000000000000027c28c665e25cd8023f442dbcc8abab87bb2538300000000000000000000000027cda603b1ae1b1cb1b4cfba6351866f374262910000000000000000000000002d00ca80a286528cc8611db5b9263f0fb6e3504600000000000000000000000038be7812944137d3dc2b78281ea0eb55a421293b00000000000000000000000048b4c3be622660924cdc64667e14cdd8ce348ddb000000000000000000000000493254f114efe1eed187e5f8d7dd7a367f5024f9000000000000000000000000537518a5ba6c3b506d9c2214cb518beaae867bf70000000000000000000000005d18e78132aedf86f2a405d8d2933dc204a73be90000000000000000000000005fe789148085683fac0dcce989bfb807271e8d580000000000000000000000006102c805a85e14853e1e3cfb5483304c6d08c59d00000000000000000000000065bfa0ddf26e90545a4fcdbdc4d7b7eee735b82200000000000000000000000068a4fb59f7f3022ccc18752f98f70e04d6d16ae60000000000000000000000006e23f8928fde6ce4b60d95f224be452538beafdf0000000000000000000000006fb12e213b0ea19cbb31ab307077acd591061ca200000000000000000000000078e79d001165136c07b85d4ec945a28b8552b1a20000000000000000000000007a3bf5cab8492d57ec310524430f77b96d0502580000000000000000000000007b68b88f9f8751ddd3692e83a230e0228133f9e2000000000000000000000000819c4c684ac7a1f3bfbaa556535851e2e82e2e650000000000000000000000008298182a159be69b96e5ebf94faef1bacb6501410000000000000000000000008c30107fdf21c3ec344b018190a7c22377536aff0000000000000000000000008f5de99cdb8795fd8c60dded53541ea9bf4c8a790000000000000000000000009218f827015c3191d2c61faf38c2fd64c1491e5d0000000000000000000000009790b9b287c51278b00fdbab2715b01e01d2c8210000000000000000000000009b2f17f65195a904a783bfdc1c40c306d643aa18000000000000000000000000a2d9f6b5893f7427af8978728c38d16b681a2824000000000000000000000000a41090021ba7833c2e34dd25650a191d720e4fbe000000000000000000000000aac7332380cce90e64a0b66f7d5c045b81573141000000000000000000000000abe6af325077d6041047beff59dc4ae71488c600000000000000000000000000b55bb609245d7113d610f29720e90740c6649f52000000000000000000000000bf971c96714c5198ad8a8ca001ef1c5eed790c6c000000000000000000000000c30836594698699f8f0107e35f98da6040ddf436000000000000000000000000cde01607a0d73d9ec92c6a0894684797e34b5829000000000000000000000000da664a27915cd9cbbd44100ed4276b6c4eadcec3000000000000000000000000df7468a4e4e87774d8678e864159d0f782024d2f000000000000000000000000eccedd1eef19a3efd143973a8cbfec3c590b42ea000000000000000000000000f06f2a8de1bf5a053b0b61434b57744a07896ee8000000000000000000000000f100598e3c48018c54d7d7107109f2be5330323e000000000000000000000000f50829c33d1b9c3af30816167637de6a290249ee000000000000000000000000f9efca275a19f8a397051eb4e6cf82626d9b68f9000000000000000000000000ff830d66181e909399ac67122db81588265df026000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000003b5000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000016900000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000001d50000000000000000000000000000000000000000000000000000000000002275000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000222200000000000000000000000000000000000000000000000000000000000021af000000000000000000000000000000000000000000000000000000000000023500000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000002c7000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000031300000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000e70000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000013e000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002d7000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000001cc0000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000001c40000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004104992b5b57d0b592602250565baf2cfabfc02bd7fd5a8a98532132ea53baadb832536c54c6b1daa2c25d3673f85b4807006384eb0d3a828b1ed2ab2e2d4318bb1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004158f6593275e5bf500298f9a19407ffce2a3276bd17f83a328e47a605d9ea08a36d735c885cdf7d1eea30db7af4f391b8a0b3f8c454f4ab1bf935a026bca7facc1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418bd4955c63f4f29673a44360e9d4bccff341ac2950d21dbd8868b6e814492eba76b8f6a2408feabfe2c640b7a50ae00618574dabaf38cf5a18d1e9240c45508c1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f490dca93d8822b040602430ea258070e3d7d5bc501d8cf1907a874b20937dea04220465e5aa2475bff3d9510741e2058e7c83fddffe3d9377a74c093dda02791c0000000000000000000000000000000000000000000000000000000000000083104ec1a0cae6b0ae80b98e807cc88b61980f8ab3ea7c54eefd2ff55e81969d9261999ecea02aa37e136ed385f34880c989ed5dbc71307d6775f273486f395967f3a14bd0fe00000071f86f0b8501e36428ca82520894966958570fec2a6da8d634b1aa25db9a606bf1628802c68af0bb1400008083104ec1a0c7d85970f044135390e0ac2cba0b6088b0a3ffb6aeaeab9fc4906d8101626161a05ecf122fe6d7354f303a57a7a905928e6182005a0d878b333dda914342f0248f00000072f8708222ed8501e36428ca82520894a6296f35370b9166263148cbd750dc4f25f455d587038d7ea4c680008083104ec2a02c8b4bc81498d1e82f791053bb5e50daf5e33a7ef74a714742a203e4b7ad90efa07b9817d21eadacd8ffcf6bff17eee490db08b9bafb493fd5f7c8b37735d304cd00000353f903508202878501e36428ca8301668694d294975a1e0994ad2d835c9431ad9cb131fffde680b902e4491606589be5baf8dfc9e65d967d7799789b77fb17869dd823628c8eb799544ad9b74552000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078386137373135663135413439446634623439346330444630333138393965434142326633314235350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000001e3062bebedd20000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000014ebb18bb1aba7b1f7d496144c96e9171c89caf5ad00000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001487243a1ea236745296ab9a0a736d594de956b32c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a09f0318214ea3c7504afa9f4aa2c067497c8ef67eef19078ae672fbf39f657f3fa003568a32a67936a2b0727e945f3ec2e2a0f9879fa6b19e72ad69699d3d59001c00000090f88e83095edc850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000024259e97983104ec1a048dbfaf73f8946d2018773a2f0cffd4cbf956ccaad8846d0ae2ffe8c6e1365f2a013e7d6a41b74d2f2ed7c87142f84f6940d8e73b26b06f7765e3ab505cc8bba2c00000000000000000000000000000000000000000000000000000000000000000000000000000000297f0900000000002e09220000000065d39369000000000000000000000000000000000000000000000000000000000000000000000000009896800003000300000000002e09230000000065d39375000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09240000000065d39381000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09250000000065d3938a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09260000000065d3938d000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e09270000000065d393a9000000000000000000000000000000000000000000000000000000000000000000000000009896800006000000000000002e09280000000065d393af000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09290000000065d393d9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e092a0000000065d393ee0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000002d3f902d0823b898501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b24e02010003020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004be3c2ed700000000000000000000000000000000000000000000000000000004be6d5feb20000000000000000000000000000000000000000000000000000004be6d5feb20000000000000000000000000000000000000000000000000000004be6e3e9ea10000000000000000000000000000000000000000000000000000000000000002d3a0495f1ecca506db79fbcddd8e7de2aad46482561eece314f23668f0d139c98264053151b3b6adfd8ff4a75b5ed34d2aec9bb2916e32320c341126c99767a200000000000000000000000000000000000000000000000000000000000000021e436313ceecc97f708c9432a41e6a38fefc196e090867f4ba02d67c649583683975459219a847cee89c3c4e58cc48a3dfbfba88b01c2466a2c7920f54a7e95283104ec1a0faf41deab9646e17598b653e4c95ba1b927458f0144b73f5137ef14ab812cd78a07f408d8991042ca5d642fb911c9b0d22cf88fc3f23039e6e5d6461efcb358c0900000090f88e83095edd850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000021ad88f5183104ec2a0dabe37b009fbb92100b39f75f6cc183f155ad9b1277205463587e0fbabee1569a024da9422a0e83faa7def9fa613f7dddbf5f989ebb634e5f68aea3bd1ddbf222d000000b1f8af827deb8501e36428ca8301a0f6946f1da9076f36000d5f9decdebd52402b1410b2c580b844468021b7000000000000000000000000b89fb651642a8c8446c760732ffc25c2c9f190f4000000000000000000000000000000000000000000000000000000000000000083104ec1a0b3ec1f069ce335a430650443a4c35a3b7a2d5daf83a0c305420ed592d9eb17f5a07c3357e7b6e67d1d7c3e56527e4b9f296d1503a75563aa1c4c4bd080fcdd1b8c000000b1f8af8207b385024820220083010f0594ea1e8e805b8671a4ec80735d5b715c551a21850d80b844095ea7b3000000000000000000000000077b28fa1a537780b372cb5bb22aa7d8d30e22d5800000000000000000000000000000000000000000000000000000000000000083104ec1a00c9c8a44357b1c545d34e4c961a3bc3f1ae6b07a6fdcd1032c8365b89186d405a06059daf66df98ef8a15bd3bafd57f474d378d1dd924d70c00713e2841dc9c0db00001453f9145082028b8501e36428ca83039bdf94e432150cce91c13a887f7d836923d5597add8e3180b913e409c5eabe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000013a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000008274f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001f3298e326db32aa16b18ea20628aa4704c8eda7011ba6c922cf47e68196c38b1000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000013617070726f7665436f6e747261637443616c6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000d294975a1e0994ad2d835c9431ad9cb131fffde6139dad6c2e3d0679f411463c7dbc0eb99db34655f4f9facf698e700f3860be2080ad37add9b944dd8eade01b5b9c8648b36c709332ca320a98a67600eb7bc881000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078386137373135663135413439446634623439346330444630333138393965434142326633314235350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000067600000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000033000000000000000000000000033249f556213e290f64cebcca0f4ae59c2d62cc000000000000000000000000081bcea66fe8ca5e09a2d4425103a7804c6c1e270000000000000000000000000b6f38dae6acb217a07bf15f8fe8321537c83f43000000000000000000000000110e75163d776f0005e1448e7dba592ba21ca78300000000000000000000000011fdde73fb55ed8a8bba92f3e9fcb762fa6ba4fe000000000000000000000000190d382a335eb4b0f131324299ff8225c9ae911d0000000000000000000000001e31a5efedc34abd89449e88bb003f26e6decf03000000000000000000000000206b1b84f594df59b9cf23cea94be1178c2048f4000000000000000000000000219cc470e99b70d9111dcfa025ce9a1ea38ed507000000000000000000000000239eb449a60cd10eb265c413e62282820362eea000000000000000000000000023c6efebc5b4d1cc38fc74a4ea96de1703d387d400000000000000000000000027c28c665e25cd8023f442dbcc8abab87bb2538300000000000000000000000027cda603b1ae1b1cb1b4cfba6351866f374262910000000000000000000000002d00ca80a286528cc8611db5b9263f0fb6e3504600000000000000000000000038be7812944137d3dc2b78281ea0eb55a421293b00000000000000000000000048b4c3be622660924cdc64667e14cdd8ce348ddb000000000000000000000000493254f114efe1eed187e5f8d7dd7a367f5024f9000000000000000000000000537518a5ba6c3b506d9c2214cb518beaae867bf70000000000000000000000005d18e78132aedf86f2a405d8d2933dc204a73be90000000000000000000000005fe789148085683fac0dcce989bfb807271e8d580000000000000000000000006102c805a85e14853e1e3cfb5483304c6d08c59d00000000000000000000000065bfa0ddf26e90545a4fcdbdc4d7b7eee735b82200000000000000000000000068a4fb59f7f3022ccc18752f98f70e04d6d16ae60000000000000000000000006e23f8928fde6ce4b60d95f224be452538beafdf0000000000000000000000006fb12e213b0ea19cbb31ab307077acd591061ca200000000000000000000000078e79d001165136c07b85d4ec945a28b8552b1a20000000000000000000000007a3bf5cab8492d57ec310524430f77b96d0502580000000000000000000000007b68b88f9f8751ddd3692e83a230e0228133f9e2000000000000000000000000819c4c684ac7a1f3bfbaa556535851e2e82e2e650000000000000000000000008298182a159be69b96e5ebf94faef1bacb6501410000000000000000000000008c30107fdf21c3ec344b018190a7c22377536aff0000000000000000000000008f5de99cdb8795fd8c60dded53541ea9bf4c8a790000000000000000000000009218f827015c3191d2c61faf38c2fd64c1491e5d0000000000000000000000009790b9b287c51278b00fdbab2715b01e01d2c8210000000000000000000000009b2f17f65195a904a783bfdc1c40c306d643aa18000000000000000000000000a2d9f6b5893f7427af8978728c38d16b681a2824000000000000000000000000a41090021ba7833c2e34dd25650a191d720e4fbe000000000000000000000000aac7332380cce90e64a0b66f7d5c045b81573141000000000000000000000000abe6af325077d6041047beff59dc4ae71488c600000000000000000000000000b55bb609245d7113d610f29720e90740c6649f52000000000000000000000000bf971c96714c5198ad8a8ca001ef1c5eed790c6c000000000000000000000000c30836594698699f8f0107e35f98da6040ddf436000000000000000000000000cde01607a0d73d9ec92c6a0894684797e34b5829000000000000000000000000da664a27915cd9cbbd44100ed4276b6c4eadcec3000000000000000000000000df7468a4e4e87774d8678e864159d0f782024d2f000000000000000000000000eccedd1eef19a3efd143973a8cbfec3c590b42ea000000000000000000000000f06f2a8de1bf5a053b0b61434b57744a07896ee8000000000000000000000000f100598e3c48018c54d7d7107109f2be5330323e000000000000000000000000f50829c33d1b9c3af30816167637de6a290249ee000000000000000000000000f9efca275a19f8a397051eb4e6cf82626d9b68f9000000000000000000000000ff830d66181e909399ac67122db81588265df026000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000003b5000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000016900000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000001d50000000000000000000000000000000000000000000000000000000000002275000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000222200000000000000000000000000000000000000000000000000000000000021af000000000000000000000000000000000000000000000000000000000000023500000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000002c7000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000031300000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000e70000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000013e000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002d7000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000001cc0000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000001c40000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000419e4cdd838f099eda8cbfbc48047259e9ce9edd5bdf1a7111aedde46fdb752e501b24052ce318b72beb033fc8ebffaccb86d653e16adc26f83f34a76e71bc66d71b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004150b36bbe0617ba18b6240e475bc5169e5b34dae65b06bb3c9f62f4d0a2c18ef227ad3341d5b0903d4cf5034396c229829e061a47e2294a7c456250519e57c26d1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041ebbe62e7c8a270f28f62ad0840c6caf25752b7cc609e4499612f048e3fcc47ad4fbee4b0346ab8a5541343295629e28ce1d27ae0078b086fc10123e858424d481c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041b6a252794e58fd0676a75a0c4fbb8c3330e17c09cf87ce7cc22a478c052675890ae83ffe966b7dfb9e99016ec19ea41c9bad8a6801c1a2f2480d76e39f384e721b0000000000000000000000000000000000000000000000000000000000000083104ec2a0012aa28041ad09da4313d27af2aa2fe2751778bf61f19ea977048be7c89313f7a07ad5de5195b4f25cce9bf4e15394c20e9509ff4437513309a6c68575662eaab400000132f9012f82acee85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000280c0000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000000056e1360000000000000000000000000000000000000000000000000000000000000001083104ec1a0c3d4481a44fb67ca969e3c70594dd64dbccefa9fa09dbb438490dbebdef88e5aa03037f0e555751d7ab5e8db3a5a333f3c6d35cd0e172df29344d0f857c5c9e3b300000132f9012f82acef85024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027ec0000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000000364cc1c0000000000000000000000000000000000000000000000000000000000000001083104ec2a071c4eccbf350cc3a9babe71acf438a6a370ee4332408bcd7886a618cd9a37cd9a034a2404be847b76e9db228d850b35677156bb053ff3f5fea719894a7a33a5ad800000132f9012f82acf085024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028070000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000040f81480000000000000000000000000000000000000000000000000000000000000001083104ec1a0f3acb5c4695d3eedbedf721086e87097ea7633f3f2bfe41b8727d7823802ad9fa012c6f64f110b3deda0a7fe5388616748def78ef73a292a506098fee918ab029400000132f9012f82acf185024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027b10000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000234066254000000000000000000000000000000000000000000000000000000000000001083104ec1a0e54e9334cb39d48bdadff220182021ef84fc6e061237f493e5b66bc7b8848942a03b478cb63c175d39c71f31b7e1793eaeae8171d8bbd2ae02f5ae00ef69b21ea100000132f9012f82acf285024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028030000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000000000f478e000000000000000000000000000000000000000000000000000000000000001083104ec1a03294e3b34512799cd02e594a1e0ae20e960ce3e458728c40e9ae52f3defe7768a050f89c9ae3298968b81a3ba59a4cb5a70784c673e4727154e68d4d96c63a3d6800000132f9012f82acf385024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028050000000000000000000000000000000000000000000000056bc75e2d6310000100000000000000000000000000000000000000000000000000000000002ab802000000000000000000000000000000000000000000000000000000000000001083104ec1a02e8db9d20e7f34606a44cca663cecdbe3562a9f47d7a28e60d8df20c4ad7a374a07ba87d7cb343d2ac9ad260a24c2fc16a6d01a4fddafa0dd4ffb7486df713bb8a00000353f903508202888501e36428ca8301668694d294975a1e0994ad2d835c9431ad9cb131fffde680b902e449160658f3298e326db32aa16b18ea20628aa4704c8eda7011ba6c922cf47e68196c38b1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078386137373135663135413439446634623439346330444630333138393965434142326633314235350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000001dd81f3305d760000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000014ebb18bb1aba7b1f7d496144c96e9171c89caf5ad00000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001487243a1ea236745296ab9a0a736d594de956b32c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a044b6a8a09ef25279c8b802b2c4d1c7ce6a69583e39b73788cf24f32bb8f64485a04752107e5b2ca457319292082748a323b4ecd3a9b38b3b2d0ef1629f668a674900000323f90320808501e36428ca83031f13808502540be400b902c560806040526040516102a53803806102a58339810160408190526100229161009b565b8042106100815760405162461bcd60e51b815260206004820152602360248201527f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460448201526275726560e81b606482015260840160405180910390fd5b600055600180546001600160a01b031916331790556100b4565b6000602082840312156100ad57600080fd5b5051919050565b6101e2806100c36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100625780638da5cb5b1461006c575b600080fd5b61004f60005481565b6040519081526020015b60405180910390f35b61006a610097565b005b60015461007f906001600160a01b031681565b6040516001600160a01b039091168152602001610059565b6000544210156100e75760405162461bcd60e51b8152602060048201526016602482015275165bdd4818d85b89dd081dda5d1a191c985dc81e595d60521b60448201526064015b60405180910390fd5b6001546001600160a01b031633146101385760405162461bcd60e51b81526020600482015260146024820152732cb7ba9030b932b713ba103a34329037bbb732b960611b60448201526064016100de565b604080514781524260208201527fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b93910160405180910390a16001546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156101a9573d6000803e3d6000fd5b5056fea264697066735822122039646d3a68203fdb441a3414dadab989dc84877d7690079e5b922deb0f014e7264736f6c634300080900330000000000000000000000000000000000000000000000000000000067b4c75683104ec2a074f5a4f4415e8b1b294a1466a2652461450dc8a6e02a5aaaf8ea66f4f97de6c8a021b517744b1332ce01849316c35912c2edcc430a435d3dbc25f1b4ac8d2c5df200000070f86e018501e36428ca825208945e809a85aa182a9921edd10a4163745bb3e3628487271471148793a38083104ec2a0b38ba2e6650fe7493240c861ef3c07411584cbc8eed3915997204cc96771bd3aa07c4168298109130110b0c8d7ccb85ef0f1cad3c098f4a8eaf78149b07d81e994000000000000000000000000000000000000000000000000000000000000000f521000000000002e092b0000000065d3940c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e092c0000000065d3941b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e092d0000000065d39424000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e092e0000000065d39433000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e092f0000000065d39470000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09300000000065d39485000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09310000000065d394a0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09320000000065d394a3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09330000000065d394ac000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09340000000065d394b2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09350000000065d394b5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09360000000065d394c4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09370000000065d394ca000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09380000000065d394d3000000000000000000000000000000000000000000000000000000000000000000000000009896800002000000000000002e09390000000065d394d7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e093a0000000065d394e3000000000000000000000000000000000000000000000000000000000000000000000000009896800002000200000090f88e83095ede850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002364dd4ff83104ec2a0f96c20c4f1c7975271d265c8cf3297a3135c8fab9f31391d181672cba1eeb808a06d89c68f3937f5864c735d038ae9fcd62bf3ffd5df0b63cb7bdba849ab65f6cd00000072f8708207738503c6c851948252089473f9b3f48ebc96ac55cb76c11053b068669a8a67872386f26fc100008083104ec2a0ff0bc97f187af1a4a269c64f0800861d29c8aa20ab43b5114ca86ca6bdc20d1da06cd73f748589454f748223c2d91311476b024f44c86d35811cbc2a6bfb0a0909000000b1f8af8207b485024820220083010f05944731b9205e0b160f471aa856ea4ea1b7d1d2d23d80b844095ea7b3000000000000000000000000077b28fa1a537780b372cb5bb22aa7d8d30e22d5800000000000000000000000000000000000000000000000000000000000000083104ec1a0e74d72b461fc68865c152c0c2ccf12160d9e27f78e1d35b4abbaa23591f28562a07ca7202d7f78adb93462e0db2b79272f084f9c510ff3f80931a23eeefe46533c00000090f88e83095edf850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002545b1b4f83104ec1a02ba0f0b59e005e4db7355b2d4656f991e5c373ed4d335f8a804b72538ce138fca05103175d26b40dc267195b4f9f6ef9f588fd6155f0154cf3235b0758f40788c300000090f88e83095ee0850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000273bd1d2f83104ec2a0b346942c832035b2a5104d0f23b4286cf294f414970391bdf8a7b5d67ca768efa04f6705af092c0250d77df1cf4ea30ebaa6736ea7deec9316fec79865e93fbaeb00000090f88e83095ee1850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000249d7f47a83104ec2a036408fc644a1212b8d482c9223bc41aa0614fc6bbc56f7c78c220691857e83dba00aad307abbe12b963065851fc1f3ad946cf56aca34410f3391880fc2ad39f8ed00000070f86e028501e36428ca825208945e809a85aa182a9921edd10a4163745bb3e3628487354a6ba7a193908083104ec2a07f47cfe91c1338b49050de0597ee9338fe0ff78792f015bb95d1b96c7c2e0aa2a00ad044333d6615e63619759e49865ef4a052eecf5a0d8f8b8f6bbe9ffebe66d700000073f8718227bb85024411ca8c830186a0946a65ae9cc23dbf7179b91efcd205797f2353669087038d7ea4c680008083104ec1a0aeeefe22d92b0b48a310449190efcf457fedaf3d226637199961510e73019cada064cc978c9651dc505d80f465e2ba836a3b8f9c0f380c3e666143bde997c019b200000090f88e83095ee2850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000227e102a483104ec1a0aa03ef2ee0a231d28a4495c31d5b77160bf76ce95d1c293c98cc836eb4527d94a05738e80c60427766a7feb77575be7f8b0d7229acdc4965a5143779d0f2ddf1ca00000071f86f758501e36428ca825208945e809a85aa182a9921edd10a4163745bb3e362848804ed369e7f4393908083104ec2a0814789347708de276f14333e2bea5dffda8095c5c0ad3c65ff184c189761cd72a0304bdd85fe0d97e2e663d4b0a68ea483eca7db33380045c690c6c7073585193c00000152f9014f8207b585024820220083036acb94077b28fa1a537780b372cb5bb22aa7d8d30e22d580b8e4baa2abde000000000000000000000000c863a642d2702d16f819696bf14eb8a2268a899400000000000000000000000075f69882aba1bbb2a75b5b05db3f00c5f365090c00000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007dbc67df4d4ea21420b1baa077028d2c1cca73990000000000000000000000000000000000000000000000000000000065d39bb183104ec2a025a1d9ce46389a5f06a7946b16c45255d16942e949c31f849f561982e8681395a01a208e8450162b020529fd51cc3d7d2e7ef702c48a16f1e81b224266427e4a9900000072f87082606085174876e80082520894b9946c6b9d3cfc3b5eeab732dc8eb6e6dd0b6a03872386f26fc100008083104ec1a07473f8b7fc259ec38738801b358e53d7bd2250cafd00a055aab450ebe032dc3aa020981a0996cf3ce43e6baf484b0a58f493b2dc624b06ea436ec3602da967b24b00000090f88e83095ee3850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000250501cc983104ec2a08d5dda9e5bdea760e5784f33142451cf3b5452febe0adef58490d64ec4707433a05b5164add25bf9ee6464254a30bcd4660daaf622e4b3d2a84f1f81023d65e44000000152f9014f8207b685024820220083036ae894077b28fa1a537780b372cb5bb22aa7d8d30e22d580b8e4baa2abde000000000000000000000000f4d453bdf9f41457c40887b16c8341e859cd408100000000000000000000000075f69882aba1bbb2a75b5b05db3f00c5f365090c000000000000000000000000000000000000000000000000000000e8d4a51000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007dbc67df4d4ea21420b1baa077028d2c1cca73990000000000000000000000000000000000000000000000000000000065d39bd383104ec2a0aed4c52d1b0993df09faff1cd0d9b232ae397787a0ed5718e3aedf223b2ba247a046a863fef3e3ee656fa9b7fcaae9a212a26e1f1b18aa5a652613ddb7cede609900000132f9012f82acf485024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028050000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000000749b8a000000000000000000000000000000000000000000000000000000000000001083104ec2a0d39fd8030f2c0c88ab7485e8cad9cc8e48d769ccd2206630c8c00c4fc97a7a9da0469a847cdebd9860b8aeadac49bcfe3c020be4ac99e25005838b8ff76527bfca00000132f9012f82acf585024411ca8c83035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027e90000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000003f1641cd000000000000000000000000000000000000000000000000000000000000001083104ec1a0b7c90e1b6912750d09cd18a208a0dbded04c0705d2ca5bd8f06b7172cf3a545da066fbec5f0bbab8754be0d05a23b040ade1ba11639b9879b444b88ff1d740228900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8f0800000000002e093b0000000065d394e6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e093c0000000065d394f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e093d0000000065d394fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e093e0000000065d39504000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e093f0000000065d3951a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09400000000065d39523000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09410000000065d3954d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09420000000065d3955f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000152f9014f8207b785024820220083036afb94077b28fa1a537780b372cb5bb22aa7d8d30e22d580b8e4baa2abde000000000000000000000000c863a642d2702d16f819696bf14eb8a2268a899400000000000000000000000075f69882aba1bbb2a75b5b05db3f00c5f365090c000000000000000000000000000000000000000000000000004ce73bf7d0e8c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007dbc67df4d4ea21420b1baa077028d2c1cca73990000000000000000000000000000000000000000000000000000000065d39be483104ec1a0fb3e5956d4474e863317399a7fa26a1a28087e6f6921fa93fecdec100527aaa4a0447112aef5f0536cfda6e1dd87457cd4d074d11aa5308f5b189dbe925c98758100000090f88e83095ee4850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002310f418c83104ec1a0f2aca0c235e8e3b0180c12c041a5703c9ec820e8bcbe7d63fc09197cb010d85da01d459b03ff71a3a6ab64dec7dab46d1c7256c8aa8464dd5e1067e6150ad26d3000000433f904308207be85025c3d32fc830282b094ca11bde05977b3631167028862be2a173976ca1180b903c482ad56cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000a38c2b5408eb1dceedbec5d61bed580589c6e71700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010400000082000000000000000000000000000000000000000000000005457808eddbd4bec30000000000000000000000000000000000000000000000000000000065d3946c0000000000000000000000000000000000000000000000000000000000000060456f052eb9cae61f400ae928802b97171711c872fd5aededd29ef77e459cfb22000000000000000000000000c5ae7423f41927d6c31587995482030190d2c807000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030c5c75000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d20f1ec72ba46b6126f96c5a91b6d3372242ce9800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010400000082000000000000000000000000000000000000000000000000347a7d198c6262190000000000000000000000000000000000000000000000000000000065d3945800000000000000000000000000000000000000000000000000000000000000603bafeb5195b8d500bc8dedd41daedabfc61399c8beded77c3e610f38c22f6db30000000000000000000000007b3be6648535fe990956ca64e243b6ac1e668c10000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000035cc5d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a07567c604801d4d637b7008cbd1c351ea88350e9d807af0e404342960179da6eba03dcc11f899788c68a1c6e41a75811b93fc5671fe6c31782e3de2521b9448a74500000173f901708207b88502482022008303238194077b28fa1a537780b372cb5bb22aa7d8d30e22d580b90104e8e33700000000000000000000000000fd9b4bb0e25031ad12029e66d17c4de826a0d3a300000000000000000000000075f69882aba1bbb2a75b5b05db3f00c5f365090c00000000000000000000000000000000000000000000000005194bc419864840000000000000000000000000000000000000000000000000000000041f461bcd0000000000000000000000000000000000000000000000000512c4fcb81dee800000000000000000000000000000000000000000000000000000000419ff5baa0000000000000000000000007dbc67df4d4ea21420b1baa077028d2c1cca73990000000000000000000000000000000000000000000000000000000065d39c0583104ec1a084c420ed50ea84721dd6103d3ac50ebc7ccb620adafd4596e9e390c885c1d542a00ac572a29e7d65731952a70bf973f9b3d524546f7e11797ef1baaf32b7e8431300000173f901708207b98502482022008303237594077b28fa1a537780b372cb5bb22aa7d8d30e22d580b90104e8e33700000000000000000000000000f4d453bdf9f41457c40887b16c8341e859cd408100000000000000000000000075f69882aba1bbb2a75b5b05db3f00c5f365090c00000000000000000000000000000000000000000000000002e73d20c9f0648000000000000000000000000000000000000000000000000000000001ccb64c8a00000000000000000000000000000000000000000000000002e385c84e0ca18000000000000000000000000000000000000000000000000000000001ca6896650000000000000000000000007dbc67df4d4ea21420b1baa077028d2c1cca73990000000000000000000000000000000000000000000000000000000065d39c1983104ec2a0eeb4c93cf7204805c0061753d0d1b66aa5dac7a3339dcd13a327621f8fa1d75ea00403ede9fec1155fe34bffd7e2858070688f3d20e0189861a2cd14d54fafd23c00000090f88e83095ee5850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000020a3b08c183104ec2a0c1840fe6a87db5c0e74a98486e438794232b04288564a53ff740cd43f10f854ca05f5f28ca51fa0d39144f009a57b4470a414839f1c20f6d892ab87f886009150900000173f901708207ba8502482022008303228894077b28fa1a537780b372cb5bb22aa7d8d30e22d580b90104e8e33700000000000000000000000000c863a642d2702d16f819696bf14eb8a2268a899400000000000000000000000075f69882aba1bbb2a75b5b05db3f00c5f365090c00000000000000000000000000000000000000000000021e19e0c9bab24000000000000000000000000000000000000000000000000000000000000022120a4200000000000000000000000000000000000000000000021b63fd1aa400c000000000000000000000000000000000000000000000000000000000000021e66e0c0000000000000000000000007dbc67df4d4ea21420b1baa077028d2c1cca73990000000000000000000000000000000000000000000000000000000065d39c4c83104ec1a06a8c479dd4afac89651e81d1ba9f53f6de4742689bf456c8de04c82e5493f1afa0718fec692f3107109d4876fcac4bd3dc1e78eb7b3c85e54d36de1a11442096ad00000090f88e83095ee6850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000001dbf2391783104ec1a043575d861947850fe9e51da9507732eb225c4570c70ba85abc3f6447745caa35a07abc776dda4ad4628dd3f5b18ff22c2db706892b1be21c22af7610741e5cf86e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef30b00000000002e09430000000065d3956b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09440000000065d39589000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09450000000065d395b0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09460000000065d395cf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09470000000065d395f0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09480000000065d395ff000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09490000000065d3960b000000000000000000000000000000000000000000000000000000000000000000000000009896800004000000000000002e094a0000000065d3960f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e094b0000000065d3961b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e094c0000000065d3961e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e094d0000000065d39633000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000090f88e83095ee7850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000021759f64c83104ec2a09330353ad9be3182c80ca58f3649af512bcd3424fff130ed77c008347237fdeda01d74b2cc8fa6adc3e8ce9b8c25e0aafac72047e3c1063ec38567af89a532626d00000090f88e83095ee8850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000001f69716f083104ec1a0bc0c0907a0f62a6abb89c97c7a55d264a0b10cf60e6d1196fe059a7d9f2b19e1a00f3d9f1259dff72665225bb800b1466eeed0fd02735b3c92c95fdfb896f83191000002d3f902d0823a258501e36428ca8307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d840003b25606000301020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000004bd111ddda0000000000000000000000000000000000000000000000000000004bd129d6776000000000000000000000000000000000000000000000000000004bd2d56e700000000000000000000000000000000000000000000000000000004bd620f9de50000000000000000000000000000000000000000000000000000000000000002d1366501cec2a1f68a961d7ca643c9265250b89bcae9b5466056e484bb1363dc736bd49900d70c6949a3df834ba98eccbdba6dd4518e568495170a8bd61d235d00000000000000000000000000000000000000000000000000000000000000024355797f8a84aa2389015eb0164a4caac43c4e65b54e00741e4baa27d454f5756173ffce94b36c59359829fb7bc85d5399051980978126fc2f141e132fd0f1f083104ec1a0632090c89a02fde2ab53f90f0af194195c405898f39a68063a0c5ab00f4d78f5a024f9182869147f4fe9ed7f929d73e6111589fa8b7b8b31028d34e25f4e87c16800000090f88e83095ee9850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000001d0c2a26e83104ec1a06cc51f63e4426a0b87ec4208fe3924e586f49a0765d1e55f4cd7f99441a4e2dba0781e8d33ed09e31380ccc32b616b4ebb9d08c9b63b0100a066f2d82554e2812f0000006ff86d81ef8501e36428ca8308bf2f94b6099980ac5b82ca41a9e83dce308fa847fd72b980841249c58b83104ec1a0bed9797aa1f5bb66af7e29b39612472b0b111ac90fc5bd3aca88474a7e5a649fa06df16f171300c094990ac259fb322da9692b6af8a53b3f0ba31ba378ff2f6b3e00000090f88e83095eea850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000020825eb2f83104ec2a09a803bfefe496053746a8060ec6715ab5da7dd1ad97926b606bc2ee3ab2c9c9fa05b2a4d619ee92f66094119ee0537ea468850a0c40c96c984a5192aca56c39f4800000090f88e83095eeb850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000246808ee583104ec2a0d79078390ac38c7c2c89853172903273ff5e52dcd1dba4559770f968fe6d65d8a03f7a19da7022612765d68716dba73f100d6d3875c0312c77a51efc40be6ebc4200000132f9012f82acf68502b815597483035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027e60000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000024411ca8c000000000000000000000000000000000000000000000000000000000000001083104ec2a0de670e3cdc6c0b4315a21b6a819c568cfaf7f594b2caf34e105b3ec76eaf0880a0302068ee0d01bb8395b9dec72c01dc41c14222ce02c90ef801cc92989146312100000132f9012f82acf78502b815597483035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000028050000000000000000000000000000000000000000000000056bc75e2d631000010000000000000000000000000000000000000000000000000000000000aa848a000000000000000000000000000000000000000000000000000000000000001083104ec2a0bb6730ad150ba283937104180f764382921d938335f1af35ac5815687be875f8a06003c53e2028fc4e98e764fb5d13c196ca0b9304d51a9b64c14a316651d95a89000000aff8ad81f08501e36428ca82dc3a9404911f8c48c2fef593709fb7ea3cd5fbbf3f4d5380b844095ea7b3000000000000000000000000837a9f1803d84a341a343f05be9705dec4b81f930000000000000000000000000000000000000000000000000000000000000c0283104ec2a026e1074abeeb5dbf6099b7083064e9dd62947bfd86697fddb12ea259e7cb60a1a057184aa20dcbe37a7b896d8d5dc843baf686b4617ac6ac1153a92b6cbe41a41900000132f9012f82acf88502b815597483035f30948b14d287b4150ff22ac73df8be720e933f659abc80b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000027e90000000000000000000000000000000000000000000000056bc75e2d63100001000000000000000000000000000000000000000000000000000000003862305e000000000000000000000000000000000000000000000000000000000000001083104ec1a01bc4065aa9f5e6bae3fb384e0aa9ac77284751deae385b2c5c99447df2f53ed3a05f336bd67430e9b7beedd51a3fab1a274c042e3f1b1aa8809c77424608f4519e0000008ff88d81f185024411ca8c8309bf1394837a9f1803d84a341a343f05be9705dec4b81f9380a4c62ba3700000000000000000000000000000000000000000000000000000000000000c0283104ec2a0c540f53525cbd8dffb46b4982a9f627e54b185091c600bf744f25eef48958ff3a00362a728f39a428e7ad00f40b5bbc651aceacce6531830941c7097428651f28d00000090f88e83095eec850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002263ed4b183104ec2a07d3c27d488a9db675d62ac30101b78d764d4cf355b2712eee342f9cfcc4302b2a041cd677777254d5ad74fec4268c8ed472062d978949ed1f7015d79e3d809c40d000000b0f8ae827dec8501e36428ca82f9e5946f1da9076f36000d5f9decdebd52402b1410b2c580b844468021b70000000000000000000000003e54b00786b506f840c8ac6e7fe38d27c0279953000000000000000000000000000000000000000000000000000000000000000083104ec2a0e0acff9653332fda27204b109def48cf7a49bbded5388ff7d51bdb91e44354b7a032f24d767b22b0c4451a92279ce521dfb7c9784ebfe14affd3045cbc201b40770000000000000000000000000000000000000000000000000000000000000000000000000000000000000037830d00000000002e094e0000000065d39636000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e094f0000000065d3965b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09500000000065d39664000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09510000000065d3966d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09520000000065d39679000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09530000000065d39688000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09540000000065d39697000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09550000000065d3969a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09560000000065d396b5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09570000000065d396d6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09580000000065d396dd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e09590000000065d396e3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000002e095a0000000065d396e6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000076f87481f285024411ca8c82ded1945300000000000000000000000000000000000004880de0b6b3a764000084d0e30db083104ec2a04ae9f46ba98324ed1e2bfa7778f47d6d750bfd3d29a63afe89cf46481ed9437da01d7cbe64ef8c468cb9f77ab07be1f08d2454fe3ddde950b28599b506dfc8791f00000090f88e83095eed850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000001f3c4641783104ec1a0cbf3cc86d54fbb028e4f003dc794c2be16eac6e84b0530d9968a907f65b5aebaa05e5b1fbc1de475e49fa379aa8b2b9578366c0687520b1d6f017a9cd2169b6d5f00000090f88e83095eee850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002322cbd4983104ec1a06f02597b0a0af49d5795006597551ea5b1bc02213b7a40256ad4b2652849afdba03ee14cc97759ca3d18bfa79d1827f2ef6e8e2242d401f9aec92d0e72d9f2b5d100000090f88e83095eef850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000002721264d983104ec2a0da563a4d835f374a6eecd1b25a5e58895f3c652688d48260f657f4e22e77b715a02111736b4e5206550ae7ea147dc2e96832e8b4e8dcfe5f24e8ce7d29c9813ebf00000090f88e83095ef0850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000223d0183e83104ec2a0b933a92c6fb3057e04d2391c7685283f981ebb14e659270148ecc5a15d0fd308a070a19824425e99cde2c236e20fc4e51a2d288a467d52b8993b602a51d815b36a00001453f9145082028c85024411ca8c83039c0294e432150cce91c13a887f7d836923d5597add8e3180b913e409c5eabe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000013a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000008274f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001de1c919b368a0c7adcdf8d2f878e8a03e5ec543fb752beb452b06bbab102f37c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000013617070726f7665436f6e747261637443616c6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000d294975a1e0994ad2d835c9431ad9cb131fffde657bdb33cf037e266f1a85ad65397b4db3ea24bac6e092d4bdb21f4fa84638eeddd3f1d0ca50afc80929e90007be95aee904d34013c00531f5d6c23084e5cc4e4000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078386137373135663135413439446634623439346330444630333138393965434142326633314235350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000067600000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000033000000000000000000000000033249f556213e290f64cebcca0f4ae59c2d62cc000000000000000000000000081bcea66fe8ca5e09a2d4425103a7804c6c1e270000000000000000000000000b6f38dae6acb217a07bf15f8fe8321537c83f43000000000000000000000000110e75163d776f0005e1448e7dba592ba21ca78300000000000000000000000011fdde73fb55ed8a8bba92f3e9fcb762fa6ba4fe000000000000000000000000190d382a335eb4b0f131324299ff8225c9ae911d0000000000000000000000001e31a5efedc34abd89449e88bb003f26e6decf03000000000000000000000000206b1b84f594df59b9cf23cea94be1178c2048f4000000000000000000000000219cc470e99b70d9111dcfa025ce9a1ea38ed507000000000000000000000000239eb449a60cd10eb265c413e62282820362eea000000000000000000000000023c6efebc5b4d1cc38fc74a4ea96de1703d387d400000000000000000000000027c28c665e25cd8023f442dbcc8abab87bb2538300000000000000000000000027cda603b1ae1b1cb1b4cfba6351866f374262910000000000000000000000002d00ca80a286528cc8611db5b9263f0fb6e3504600000000000000000000000038be7812944137d3dc2b78281ea0eb55a421293b00000000000000000000000048b4c3be622660924cdc64667e14cdd8ce348ddb000000000000000000000000493254f114efe1eed187e5f8d7dd7a367f5024f9000000000000000000000000537518a5ba6c3b506d9c2214cb518beaae867bf70000000000000000000000005d18e78132aedf86f2a405d8d2933dc204a73be90000000000000000000000005fe789148085683fac0dcce989bfb807271e8d580000000000000000000000006102c805a85e14853e1e3cfb5483304c6d08c59d00000000000000000000000065bfa0ddf26e90545a4fcdbdc4d7b7eee735b82200000000000000000000000068a4fb59f7f3022ccc18752f98f70e04d6d16ae60000000000000000000000006e23f8928fde6ce4b60d95f224be452538beafdf0000000000000000000000006fb12e213b0ea19cbb31ab307077acd591061ca200000000000000000000000078e79d001165136c07b85d4ec945a28b8552b1a20000000000000000000000007a3bf5cab8492d57ec310524430f77b96d0502580000000000000000000000007b68b88f9f8751ddd3692e83a230e0228133f9e2000000000000000000000000819c4c684ac7a1f3bfbaa556535851e2e82e2e650000000000000000000000008298182a159be69b96e5ebf94faef1bacb6501410000000000000000000000008c30107fdf21c3ec344b018190a7c22377536aff0000000000000000000000008f5de99cdb8795fd8c60dded53541ea9bf4c8a790000000000000000000000009218f827015c3191d2c61faf38c2fd64c1491e5d0000000000000000000000009790b9b287c51278b00fdbab2715b01e01d2c8210000000000000000000000009b2f17f65195a904a783bfdc1c40c306d643aa18000000000000000000000000a2d9f6b5893f7427af8978728c38d16b681a2824000000000000000000000000a41090021ba7833c2e34dd25650a191d720e4fbe000000000000000000000000aac7332380cce90e64a0b66f7d5c045b81573141000000000000000000000000abe6af325077d6041047beff59dc4ae71488c600000000000000000000000000b55bb609245d7113d610f29720e90740c6649f52000000000000000000000000bf971c96714c5198ad8a8ca001ef1c5eed790c6c000000000000000000000000c30836594698699f8f0107e35f98da6040ddf436000000000000000000000000cde01607a0d73d9ec92c6a0894684797e34b5829000000000000000000000000da664a27915cd9cbbd44100ed4276b6c4eadcec3000000000000000000000000df7468a4e4e87774d8678e864159d0f782024d2f000000000000000000000000eccedd1eef19a3efd143973a8cbfec3c590b42ea000000000000000000000000f06f2a8de1bf5a053b0b61434b57744a07896ee8000000000000000000000000f100598e3c48018c54d7d7107109f2be5330323e000000000000000000000000f50829c33d1b9c3af30816167637de6a290249ee000000000000000000000000f9efca275a19f8a397051eb4e6cf82626d9b68f9000000000000000000000000ff830d66181e909399ac67122db81588265df026000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000003b5000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000016900000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000001d50000000000000000000000000000000000000000000000000000000000002275000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000222200000000000000000000000000000000000000000000000000000000000021af000000000000000000000000000000000000000000000000000000000000023500000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000002c7000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000031300000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000e70000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000013e000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002d7000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000001cc0000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000001c40000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000ad0000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000041bbaa3a77159aa2fc0379b6d768ab86d2ba9a8579e368f87c3c6e851bac81f33f58d1eacd586df9baee76ecf9bb237f97d0bfb32e8e088c986c3b3424475e34511c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e5969a78bd78963c8dd14ac0cfafa823265a6ca0a8b398c27fe5d7b8e886405503e970f90e5546ac9ce71226940cdc7bd18355e74a7ce31c02a8def16f60e5931c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041391480aaeae91065233d3fd00df52d11053e88d82722153fe1ad1689ff01eab00c524ceb8724edeb5f40f52f7ead3acb2dce94803481205c3ee1f5070e9f92541b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004104bf27683a23130991eedc9081f391868a9bec736ccb9875ab8adc9ce0aa3db342766f7c5e4b9961add18ad7fccd5f293a0c3ef0a171c3eb3c18cccbe9bcd21e1c0000000000000000000000000000000000000000000000000000000000000083104ec1a0b15a684e23a383fa38c20745258ad60e09d33ae0abd5fc68e4b0bbf05d96ee60a05b278f056e32a7c0a816b6e203213a96c258c5e41f5cf942b9e1ba1cc81e1ad600000090f88e83095ef1850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b50000000000000000000000000000000000000000000000000000000241d8929883104ec1a0317bf101b0b1df3b41afdec9409ccc9a35de4e677c3e87156595683960956219a02337fb98d0b9fff165da8861b3cf82e4ba4efc9c9bee0cee2c8bee92021ec2ee00000353f903508202898501e36428ca8301666d94d294975a1e0994ad2d835c9431ad9cb131fffde680b902e449160658de1c919b368a0c7adcdf8d2f878e8a03e5ec543fb752beb452b06bbab102f37c000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078386137373135663135413439446634623439346330444630333138393965434142326633314235350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000311187a5620000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000014f1b903291b1c06dcdd3d27a3bc5e5f090d3fb96600000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001487243a1ea236745296ab9a0a736d594de956b32c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a0f028ddc11bb82089307e033b0ac188f2c0de667a590b95e7a68c01b0b717cd3ea00e589d70278e45962b5f77035550afadcdd42e74517d1085e4444cfbb478d34200000090f88e83095ef2850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000021d839cb983104ec2a00c527a67e116cec91dc991b358a897a5f62ed23068b71a277a95ad9425ab24e7a040b564a3ea2eed0921fe9aa161d87169c3b077b08cda5f8d4d581003cc1ba5dd00001453f9145082028d85024411ca8c83039c1a94e432150cce91c13a887f7d836923d5597add8e3180b913e409c5eabe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000013a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000008274f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000137dcb33c5c5607caf978b1ae9d491f3b1ca487a5c1f5549a39684dc08b1f2ad9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000013617070726f7665436f6e747261637443616c6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000d294975a1e0994ad2d835c9431ad9cb131fffde66de08d195df5e958c427d900c2c831cde589d75c90960fe56f9f2a5c59f5300d8046cd732d2059232040f2b6c148cea1793769d5e85b27a1536b49a0acf724df000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078386137373135663135413439446634623439346330444630333138393965434142326633314235350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000067600000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000033000000000000000000000000033249f556213e290f64cebcca0f4ae59c2d62cc000000000000000000000000081bcea66fe8ca5e09a2d4425103a7804c6c1e270000000000000000000000000b6f38dae6acb217a07bf15f8fe8321537c83f43000000000000000000000000110e75163d776f0005e1448e7dba592ba21ca78300000000000000000000000011fdde73fb55ed8a8bba92f3e9fcb762fa6ba4fe000000000000000000000000190d382a335eb4b0f131324299ff8225c9ae911d0000000000000000000000001e31a5efedc34abd89449e88bb003f26e6decf03000000000000000000000000206b1b84f594df59b9cf23cea94be1178c2048f4000000000000000000000000219cc470e99b70d9111dcfa025ce9a1ea38ed507000000000000000000000000239eb449a60cd10eb265c413e62282820362eea000000000000000000000000023c6efebc5b4d1cc38fc74a4ea96de1703d387d400000000000000000000000027c28c665e25cd8023f442dbcc8abab87bb2538300000000000000000000000027cda603b1ae1b1cb1b4cfba6351866f374262910000000000000000000000002d00ca80a286528cc8611db5b9263f0fb6e3504600000000000000000000000038be7812944137d3dc2b78281ea0eb55a421293b00000000000000000000000048b4c3be622660924cdc64667e14cdd8ce348ddb000000000000000000000000493254f114efe1eed187e5f8d7dd7a367f5024f9000000000000000000000000537518a5ba6c3b506d9c2214cb518beaae867bf70000000000000000000000005d18e78132aedf86f2a405d8d2933dc204a73be90000000000000000000000005fe789148085683fac0dcce989bfb807271e8d580000000000000000000000006102c805a85e14853e1e3cfb5483304c6d08c59d00000000000000000000000065bfa0ddf26e90545a4fcdbdc4d7b7eee735b82200000000000000000000000068a4fb59f7f3022ccc18752f98f70e04d6d16ae60000000000000000000000006e23f8928fde6ce4b60d95f224be452538beafdf0000000000000000000000006fb12e213b0ea19cbb31ab307077acd591061ca200000000000000000000000078e79d001165136c07b85d4ec945a28b8552b1a20000000000000000000000007a3bf5cab8492d57ec310524430f77b96d0502580000000000000000000000007b68b88f9f8751ddd3692e83a230e0228133f9e2000000000000000000000000819c4c684ac7a1f3bfbaa556535851e2e82e2e650000000000000000000000008298182a159be69b96e5ebf94faef1bacb6501410000000000000000000000008c30107fdf21c3ec344b018190a7c22377536aff0000000000000000000000008f5de99cdb8795fd8c60dded53541ea9bf4c8a790000000000000000000000009218f827015c3191d2c61faf38c2fd64c1491e5d0000000000000000000000009790b9b287c51278b00fdbab2715b01e01d2c8210000000000000000000000009b2f17f65195a904a783bfdc1c40c306d643aa18000000000000000000000000a2d9f6b5893f7427af8978728c38d16b681a2824000000000000000000000000a41090021ba7833c2e34dd25650a191d720e4fbe000000000000000000000000aac7332380cce90e64a0b66f7d5c045b81573141000000000000000000000000abe6af325077d6041047beff59dc4ae71488c600000000000000000000000000b55bb609245d7113d610f29720e90740c6649f52000000000000000000000000bf971c96714c5198ad8a8ca001ef1c5eed790c6c000000000000000000000000c30836594698699f8f0107e35f98da6040ddf436000000000000000000000000cde01607a0d73d9ec92c6a0894684797e34b5829000000000000000000000000da664a27915cd9cbbd44100ed4276b6c4eadcec3000000000000000000000000df7468a4e4e87774d8678e864159d0f782024d2f000000000000000000000000eccedd1eef19a3efd143973a8cbfec3c590b42ea000000000000000000000000f06f2a8de1bf5a053b0b61434b57744a07896ee8000000000000000000000000f100598e3c48018c54d7d7107109f2be5330323e000000000000000000000000f50829c33d1b9c3af30816167637de6a290249ee000000000000000000000000f9efca275a19f8a397051eb4e6cf82626d9b68f9000000000000000000000000ff830d66181e909399ac67122db81588265df026000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000003b5000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000016900000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000001d50000000000000000000000000000000000000000000000000000000000002275000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000222200000000000000000000000000000000000000000000000000000000000021af000000000000000000000000000000000000000000000000000000000000023500000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000002c7000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000031300000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000e70000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000013e000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002d7000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000001cc0000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000001c40000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000ad0000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000041b37d42e16595ed3c7c21ae4dc29a666b76cf795ab766a32d73ced5440cba00e21fc59c35a079f2e30d4203b544c88de467e86fbb832e775599ecdfd0055a1a971c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041492175dafedaee3a8d19dff1841e3c3589bef2fe92fbabb913e547e92b688f645da650b1c111b3bd2ce9a79f8ae8497fb264229ae503e978a57e345551b742e21c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041334bab0c1c292d5f826531dd4c8e91ad7e83086c6352473263ad2bf226aeefd14e21d18eaf1913c2fd1bd9db434caea30ecf392dd4aae97be93dd8fd593c5dc81c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410c9c24a0a5e51dbd68e42c43717d707009166a9b5551bcfff6a3c5786dc1aa28753ae4a3d1c088d0a2bccb9609db15ef0d367f3703a86470581a37a00dd848231c0000000000000000000000000000000000000000000000000000000000000083104ec1a0ee98cd9114d2e2513c10ad8ecb0024eb139eec9d3fbfa7ca1d6133f9e037fc2da05eb3348523469f454b9221de1a296df868d5a7b70a6341a4511e0b3656071ec700000090f88e83095ef3850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000001edb1d70f83104ec2a05c0e35069946f01d77efa056a197b821440f3dee7325ac163a50a32ba5f0e48ea016184df3ac04913328d36d54de2693ed38f6ecb0c60ca06210703666ea5d5f6600000353f9035082028a85024411ca8c8301668694d294975a1e0994ad2d835c9431ad9cb131fffde680b902e44916065837dcb33c5c5607caf978b1ae9d491f3b1ca487a5c1f5549a39684dc08b1f2ad9000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078386137373135663135413439446634623439346330444630333138393965434142326633314235350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000001d81d22b7507c0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000014ebb18bb1aba7b1f7d496144c96e9171c89caf5ad00000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001487243a1ea236745296ab9a0a736d594de956b32c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a049e0196776a9d3347d1b5757d2ec3eb459327b132c0693768f8e1a6f80ce6220a06e973c19fa857e38e1692bc495f4e265d696634bcad0a3ae93db4ee74cf6596e00000090f88e83095ef4850192d3775382a4f294530000000000000000000000000000000000000280a4bede39b5000000000000000000000000000000000000000000000000000000021848e73883104ec1a0e17ebe9b5b839af04b64f7211719cb609c24659590ec941f553ece05c0accb6fa078afb8ae70fab38da0222e283a3f658ab2817889383d5edee08cd7ec6c1dad79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "last_batch_index_proof": { + "proofs": [ + { + "key": "0x9c", + "proof": [ + "0xf90211a000b115159e2cf274be4a480850f31ade5f2d5c8250e9df5cd5bc7ea60781dfc9a00c20f366dd9f8a1bd3aa464331c27776df116f49249e97e8a07bdc63b576c20da0731bdb9e0e63d8822eefee6a128fa6d08a1ef785634afa846be81702ef39ba0da0a06590528dd0e27f43682ed353ab3efb997b1e38cb72a5449fcbf9f14927a92aa08becca8e365d7e2ceee9ae7b1f0c4a66303ea3ec8a1bed63cfa48daf0f885ed3a0e05b013911fd1834327cb92e4f7e74bb38ff6f92d0ad0d1d87695b69ebf62c70a0ae6412f3d352a6cdfc06fefbbcd9845bb9b3422c205ddbc8ecd90f18207abdf4a001ffce658c9b2a5b32797f611fafaa21c107dd88cc43aebbd1b8be318f34d10ba0145cddbde2805661d5fc9d8bfac4a3168e9ce299d84c29df85833a5b8a8b0d4fa0a47ce92df9913f3ed8e7a178fb6f8ced040b8c1dcb1076b8280301a50a329d52a07de1c1f78a7dfb5aa2b84e09a837e381b1517d14aa15468b8297977ccb3f04a1a0cc4ed37c770000e3748487aa32ccba9112dc5997884868e5228f200aa362bb56a00ecaeb6cdd27af319aeaf3445b3f771582ceb20d41c480d60f0560712f674dffa016a1a71f7227fb0bdc22f531539053c4136335512e833b9a8a7a0f713f26957ba097c8879c188a6b63a542e61705dc3048a6403b33ed4d2b8f1f873010ce58a61ca007fc91a96001e1f19cf482aa39fc646ceead15370bb6f8d0a9277c47adbf36d680", + "0xf90211a05b750b6cf206416969c471d941426156c0472519ecb5ee0452e39fe60ec13041a0c7768fabd00123a900185a194ca9a3419f85631dddc45f9287f28b4db55606c6a0bab22b0556e633eb800aa2d20e24267948bb682351e2708a5523d5896fc59bc3a00ecc8f4d24fc6f75fe919e7a369b079ea938df69c72cec32bfa92c76494677d9a041839161aca73b444bfab2133c6a2062650849d96ab2828f905c34c09d635571a05df355b13108916829e1605b8f20cac4577ddf621545cd6ada1d584a5488202ca08b9220734d521ffd050d7b261ca7e3c8ac6078a24c13d285db440c8995db44dca0e227610b1ddacf727b305bd159d56287b051ca74ac9cdbbd91af26054683c1a3a0d32c79db33ff29cb146084b484d0b4009890f969e63c17df50f0c2e0ea5b8bf6a06c5c740dc907f226374a0d7185c908672f75f4a60f8f60aaa9f4d95adb72304ca0b2faf70749a7c5dc6bfd3aa20b5063f9dcdaf5d9439c819e926f8fccb4643d15a043655f1e55b184a8843bd6bd35dc5ea8beb556f683a7af9437cc5e57c6b30b34a00a0a6b589fc3e78f0499f019287a18f550559b94382f4450b06860a006a76991a0b24687e06450231c4cbfe158d859420ee63096a42170e4faf57c76aae5a15d4fa0316541dbf5d9a09ca412bf5646d4549ab4fd6bce6bc17cb3c8dc670c85e5268ca05ac1e000d0de0cc6877e3e6b369a447e92c973bc8240dd9f029e1d2d8f826eda80", + "0xf90211a0d11c7773cbed184d7af1c7d90651bde6fa71aa75515bbfac5c04ffae3e084503a07e8674f6a909ef0a0df6de4bc9d6b0a7fa5e7ee520db7469dbd8b82b49bdad23a082f94861336b402c423391104cdbd80ea29130e36a914c1b8c74ae0164fb0ed8a0f513f5a83ea14c5dabb2df6d547b12aa213a25d43dcbd658961397e01236d8fda0e8a09da79fd176bcefec37b66eab9ea5f2c9d262b7857fa3a7e8134b0d81fef0a078c20880032f2a123c9e1b5b00a3d49ef4d8be3a003cd04c8a5ed06a334b61c3a016b31a5651e8a94b8c37c85627f02254a1786642d9e0182995493ecb3a67441fa0b1b2f8c1d7964c93f7674d5cb0b22b473ecd9c9783af81e5130a6c90cbc45b15a0515753da7a057565fdca518f5450f3d3fcc9668d656321cec29477eedc93c488a0a4c08feea1859b7f3be9e61356b9e1c749537ee7922a0639dbe91bd8abe179f3a0e1e5a44573dafef2ea80ad5371ebb46c84840c921bdbd38ff326eb08b66f34cba085a86bbc26cdc4bf3dc571e28545c70fbb725a683caa794a03e533e988ad4059a0e31862a7c047e2ae7f4764f10f1442ca1ce385b13a564cce09b5e34cf9c451dba0c41a7c299a652cd8cf7929af96a06c033a60f779469eb5d84908194c63c59a48a06dcd21d9616300450f2a3298524a652bd1b7dd6732950bd9189cc4acb42b8058a01e94024cb216dc86785d5e4e3d11e25392d6680a67bfe294fa347ce932bb124680", + "0xf90211a09a3c2ec24073de2a6356fe12ff5ff5402a5632ac5d877c4998ddd03ad9f9d993a082fe50db7111be23176def6ada1e0952be361d04f73f09d9d2481dfb1010c3eba0882abfbf12225fc442e1a89de4c560a0f959256255c7f3c1861f0eefc7ef2a94a03c4e6f65f17ab56fdcf908ed3adc800ceb0b876e10b91a511d58ca250d4f826ca0800a06dc4a48928d47fa8dcccc580a54ae1a01f73aeb5ae434ed835cd6b8ae93a03d6e6ba19adbf06602b4261ff744c7de8e4b3f70920d5e66146c5c7b3efad4e0a014f181d4227392c10886d8669cbeaf40a50172e3ef089bde7b31c65a7188566ea090935c7bf50aaeacd868db04440c21210f4d1f3dddc82dfe4e22c91985c25ca8a0a77894b6ccfa6e524e3a42e820da14edee8dd8c1531038f93448f778fac337a9a0456e980c5f0926f191efa5eb82e8d24243ea8cb07996375677f01029a0c903daa0b033c89299efa1d44e37f7a8ae8882c594ef5c789cff1b0ada90cab2f65e9d3ea034602d86244b1da55b25fa63b912dd78fe2cee4f2539fb46e5130708420a30cea0c55f1065cf835b31e11ec7ff8eaec1a5b31cae3e620a05b107c15282df1ab3cda0709718af75ea26c1eb3eff249c5b0a99d87acf7a8a13a889f6efc10cfae9db75a05be22cb81afc07e3038091c5de6d7935521901a649743b0f840b91187ab228a0a0af9953223cdd4bfd048310e585587a099761b6ed4ce64142630125c9bab198d880", + "0xf871a0aa1ea7ff8c84dc737bed63bdccbc0437b588b4b6e2b208a65c7ce1256ae9b8ae80808080808080808080a06609c08afdd2820f09138014ee98ebdc455eea1e96ffe53fa464f5aab3890dab808080a09ee310043956460be2c3e3b1da189b120e7a1c9c24d8892238c71f6ec4e1a50b80", + "0xe39e39071dfafeac1409d3f1d19bafc9bc7c37974cde8df0ee6168f0086e539c8382ff2f" + ], + "value": "0xff2f" + } ] } } diff --git a/lib/serde-utils/src/lib.rs b/lib/serde-utils/src/lib.rs index b646b2a03a..0b05f084cf 100644 --- a/lib/serde-utils/src/lib.rs +++ b/lib/serde-utils/src/lib.rs @@ -374,6 +374,50 @@ pub mod string { } } +pub mod map_numeric_keys_as_string { + use alloc::{ + collections::BTreeMap, + string::{String, ToString}, + }; + use core::{fmt::Display, str::FromStr}; + + use serde::{de::Deserialize, Deserializer, Serialize, Serializer}; + + pub fn serialize(data: M, serializer: S) -> Result + where + S: Serializer, + K: Display, + V: Serialize, + M: IntoIterator + Copy, + { + serializer.collect_map(data.into_iter().map(|(k, v)| (k.to_string(), v))) + } + + pub fn deserialize<'de, D, M, K, V>(deserializer: D) -> Result + where + D: Deserializer<'de>, + K: FromStr, + V: Deserialize<'de>, + M: FromIterator<(K, V)>, + { + >::deserialize(deserializer).and_then(|s| { + s.into_iter() + .map(|(k, v)| { + Ok(( + k.parse() + // TODO fix error situation + // FromStr::Err has no bounds + .map_err(|_| { + serde::de::Error::custom("failure to parse string data") + })?, + v, + )) + }) + .collect() + }) + } +} + pub mod string_opt { use alloc::string::String; use core::{fmt, str::FromStr}; diff --git a/lib/unionlabs/src/ibc/lightclients/scroll/client_state.rs b/lib/unionlabs/src/ibc/lightclients/scroll/client_state.rs index c8ba8f08a6..a1aaa6e183 100644 --- a/lib/unionlabs/src/ibc/lightclients/scroll/client_state.rs +++ b/lib/unionlabs/src/ibc/lightclients/scroll/client_state.rs @@ -11,6 +11,7 @@ use crate::{errors::InvalidLength, hash::H160, ibc::core::client::height::Height from ))] pub struct ClientState { + // TODO: This should be ClientId pub l1_client_id: String, pub chain_id: U256, pub latest_batch_index: u64, @@ -18,6 +19,7 @@ pub struct ClientState { pub frozen_height: Height, pub rollup_contract_address: H160, pub rollup_finalized_state_roots_slot: U256, + pub rollup_committed_batches_slot: U256, pub ibc_contract_address: H160, pub ibc_commitment_slot: U256, } @@ -37,6 +39,7 @@ impl From for protos::union::ibc::lightclients::scroll::v1::ClientS .into(), ibc_contract_address: value.ibc_contract_address.into(), ibc_commitment_slot: value.ibc_commitment_slot.to_be_bytes().into(), + rollup_committed_batches_slot: value.rollup_committed_batches_slot.to_be_bytes().into(), } } } @@ -50,6 +53,7 @@ pub enum TryFromClientStateError { RollupFinalizedStateRootsSlot(InvalidLength), IbcContractAddress(InvalidLength), IbcCommitmentSlot(InvalidLength), + RollupCommittedBatchesSlot(InvalidLength), } impl TryFrom for ClientState { @@ -79,6 +83,10 @@ impl TryFrom for Clie .map_err(TryFromClientStateError::IbcContractAddress)?, ibc_commitment_slot: U256::try_from_be_bytes(&value.ibc_commitment_slot) .map_err(TryFromClientStateError::IbcCommitmentSlot)?, + rollup_committed_batches_slot: U256::try_from_be_bytes( + &value.rollup_committed_batches_slot, + ) + .map_err(TryFromClientStateError::RollupCommittedBatchesSlot)?, }) } } diff --git a/lib/unionlabs/src/ibc/lightclients/scroll/header.rs b/lib/unionlabs/src/ibc/lightclients/scroll/header.rs index cb93201098..41b14d4963 100644 --- a/lib/unionlabs/src/ibc/lightclients/scroll/header.rs +++ b/lib/unionlabs/src/ibc/lightclients/scroll/header.rs @@ -1,3 +1,5 @@ +use alloc::collections::BTreeMap; + use macros::model; use crate::{ @@ -17,10 +19,18 @@ pub struct Header { pub l1_height: Height, pub l1_account_proof: AccountProof, pub l2_state_root: H256, + /// This is the finalized state root proof, i.e. the l2 state on the l1 pub l2_state_proof: StorageProof, pub last_batch_index: u64, pub last_batch_index_proof: StorageProof, + pub batch_hash_proof: StorageProof, pub l2_ibc_account_proof: AccountProof, + #[serde(with = "::serde_utils::hex_string")] + #[debug(wrap = ::serde_utils::fmt::DebugAsHex)] + pub commit_batch_calldata: Vec, + #[serde(with = "::serde_utils::map_numeric_keys_as_string")] + pub l1_message_hashes: BTreeMap, + pub blob_versioned_hash: Option, } impl From

for protos::union::ibc::lightclients::scroll::v1::Header { @@ -33,6 +43,22 @@ impl From
for protos::union::ibc::lightclients::scroll::v1::Header { last_batch_index: value.last_batch_index, last_batch_index_proof: Some(value.last_batch_index_proof.into()), l2_ibc_account_proof: Some(value.l2_ibc_account_proof.into()), + batch_hash_proof: Some(value.batch_hash_proof.into()), + commit_batch_calldata: value.commit_batch_calldata, + l1_message_hashes: value + .l1_message_hashes + .into_iter() + .map(|(queue_index, message_hash)| { + protos::union::ibc::lightclients::scroll::v1::IdentifiedL1MessageHash { + queue_index, + message_hash: message_hash.into_bytes(), + } + }) + .collect(), + blob_versioned_hash: value + .blob_versioned_hash + .map(Into::into) + .unwrap_or_default(), } } } @@ -45,6 +71,9 @@ pub enum TryFromHeaderError { L2StateProof(TryFromStorageProofError), LastBatchIndexProof(TryFromStorageProofError), L2IbcAccountProof(TryFromAccountProofError), + BatchHashProof(TryFromStorageProofError), + L1MessageHash(InvalidLength), + BlobVersionedHash(InvalidLength), } impl TryFrom for Header { @@ -72,6 +101,37 @@ impl TryFrom for Header { l2_ibc_account_proof: required!(value.l2_ibc_account_proof)? .try_into() .map_err(TryFromHeaderError::L2IbcAccountProof)?, + batch_hash_proof: required!(value.batch_hash_proof)? + .try_into() + .map_err(TryFromHeaderError::BatchHashProof)?, + commit_batch_calldata: value.commit_batch_calldata, + l1_message_hashes: value + .l1_message_hashes + .into_iter() + .map( + |protos::union::ibc::lightclients::scroll::v1::IdentifiedL1MessageHash { + queue_index, + message_hash, + }| { + Ok(( + queue_index, + message_hash + .try_into() + .map_err(TryFromHeaderError::L1MessageHash)?, + )) + }, + ) + .collect::>()?, + blob_versioned_hash: if value.blob_versioned_hash.is_empty() { + None + } else { + Some( + value + .blob_versioned_hash + .try_into() + .map_err(TryFromHeaderError::BlobVersionedHash)?, + ) + }, }) } } diff --git a/lib/voyager-message/Cargo.toml b/lib/voyager-message/Cargo.toml index 54c12cb10d..9ef8b95226 100644 --- a/lib/voyager-message/Cargo.toml +++ b/lib/voyager-message/Cargo.toml @@ -23,4 +23,4 @@ hex-literal = { workspace = true } serde_json = "1.0.115" [features] -arbitrary = ["dep:arbitrary"] +arbitrary = ["dep:arbitrary", "block-message/arbitrary", "relay-message/arbitrary"] diff --git a/lib/voyager-message/src/lib.rs b/lib/voyager-message/src/lib.rs index a48be53d7c..e36499aa8e 100644 --- a/lib/voyager-message/src/lib.rs +++ b/lib/voyager-message/src/lib.rs @@ -1187,6 +1187,19 @@ mod tests { }, ))); + println!("---------------------------------------"); + println!("Scroll - fetch update header"); + println!("---------------------------------------"); + print_json::(fetch(relay_message::id::, _>( + scroll_chain_id, + relay_message::fetch::Fetch::UpdateHeaders(relay_message::fetch::FetchUpdateHeaders { + counterparty_chain_id: union_chain_id.clone(), + counterparty_client_id: parse!("08-wasm-0"), + update_from: parse!("0-1"), + update_to: parse!("0-4846816"), + }), + ))); + print_json::(fetch(block_message::id::( "simd-devnet-1".parse().unwrap(), block_message::fetch::FetchBlock { diff --git a/light-clients/scroll-light-client/Cargo.toml b/light-clients/scroll-light-client/Cargo.toml index c7f2537763..b0f3ebdf31 100644 --- a/light-clients/scroll-light-client/Cargo.toml +++ b/light-clients/scroll-light-client/Cargo.toml @@ -13,20 +13,22 @@ workspace = true crate-type = ["cdylib", "rlib"] [dependencies] -cosmwasm-std = { workspace = true, features = ["abort"] } -ethereum-verifier = { workspace = true } -hex = { workspace = true } -ics008-wasm-client = { workspace = true } -protos = { workspace = true } -rlp = { workspace = true } -schemars = { workspace = true } -scroll-verifier = { workspace = true } -serde = { workspace = true, features = ["derive"] } -serde-json-wasm = { workspace = true } -sha3 = { workspace = true } -thiserror = { workspace = true } -tiny-keccak = { workspace = true, features = ["keccak"] } -unionlabs = { workspace = true, features = ["ethabi", "stargate"] } +cosmwasm-std = { workspace = true, features = ["abort"] } +ethereum-verifier = { workspace = true } +ethers-core.workspace = true +hex = { workspace = true } +ics008-wasm-client = { workspace = true } +protos = { workspace = true } +rlp = { workspace = true } +schemars = { workspace = true } +scroll-codec.workspace = true +scroll-verifier = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde-json-wasm = { workspace = true } +sha3 = { workspace = true } +thiserror = { workspace = true } +tiny-keccak = { workspace = true, features = ["keccak"] } +unionlabs = { workspace = true, features = ["ethabi", "stargate"] } [dev-dependencies] base64 = { workspace = true } diff --git a/light-clients/scroll-light-client/src/client.rs b/light-clients/scroll-light-client/src/client.rs index 20a50afc97..80165145b0 100644 --- a/light-clients/scroll-light-client/src/client.rs +++ b/light-clients/scroll-light-client/src/client.rs @@ -1,4 +1,5 @@ use cosmwasm_std::{Deps, DepsMut, Env}; +use ethers_core::abi::AbiDecode; use ics008_wasm_client::{ storage_utils::{ read_client_state, read_consensus_state, save_client_state, save_consensus_state, @@ -6,6 +7,11 @@ use ics008_wasm_client::{ }, IbcClient, Status, StorageState, }; +use scroll_codec::{ + batch_header::BatchHeader, + chunk::{ChunkV0, ChunkV1}, + CommitBatchCall, +}; use sha3::Digest; use unionlabs::{ cosmwasm::wasm::union::custom_query::{query_consensus_state, UnionCustomQuery}, @@ -133,20 +139,38 @@ impl IbcClient for ScrollLightClient { fn update_state( mut deps: DepsMut, - env: Env, + _env: Env, header: Self::Header, ) -> Result, Self::Error> { let mut client_state: WasmClientState = read_client_state(deps.as_ref())?; - let l1_consensus_state = query_consensus_state::( - deps.as_ref(), - &env, - client_state.data.l1_client_id.clone(), - header.l1_height, - )?; + + let call = ::decode(header.commit_batch_calldata)?; + + let timestamp = match BatchHeader::decode(call.parent_batch_header)? { + BatchHeader::V0(_) => { + call.chunks + .last() + .map(ChunkV0::decode) + .ok_or(Error::EmptyBatch)?? + .blocks + } + BatchHeader::V1(_) => { + call.chunks + .last() + .map(ChunkV1::decode) + .ok_or(Error::EmptyBatch)?? + .blocks + } + } + .pop() + .ok_or(Error::EmptyBatch)? + .timestamp; + if client_state.data.latest_batch_index < header.last_batch_index { client_state.data.latest_batch_index = header.last_batch_index; update_client_state(deps.branch(), client_state, header.last_batch_index); } + let updated_height = Height { // TODO: Extract into a constant revision_number: 0, @@ -156,7 +180,8 @@ impl IbcClient for ScrollLightClient { data: ConsensusState { batch_index: header.last_batch_index, ibc_storage_root: header.l2_ibc_account_proof.storage_root, - timestamp: l1_consensus_state.data.timestamp, + // must be nanos + timestamp: 1_000_000_000 * timestamp, }, }; save_consensus_state(deps, consensus_state, &updated_height); diff --git a/light-clients/scroll-light-client/src/errors.rs b/light-clients/scroll-light-client/src/errors.rs index edbd4efb8c..071399a6fe 100644 --- a/light-clients/scroll-light-client/src/errors.rs +++ b/light-clients/scroll-light-client/src/errors.rs @@ -3,13 +3,17 @@ use ethereum_verifier::{ ValidateLightClientError, VerifyAccountStorageRootError, VerifyStorageAbsenceError, VerifyStorageProofError, }; +use scroll_codec::{ + batch_header::BatchHeaderDecodeError, + chunk::{ChunkV0DecodeError, ChunkV1DecodeError}, +}; use thiserror::Error as ThisError; use unionlabs::{ hash::{H160, H256}, ibc::core::client::height::Height, }; -#[derive(ThisError, Debug, PartialEq)] +#[derive(ThisError, Debug)] pub enum Error { #[error("{0}")] Std(#[from] StdError), @@ -76,6 +80,21 @@ pub enum Error { #[error("error while calling custom query: {0}")] CustomQuery(#[from] unionlabs::cosmwasm::wasm::union::custom_query::Error), + + #[error("error decoding commit batch calldata")] + CommitBatchDecode(#[from] ethers_core::abi::AbiError), + + #[error("empty batch")] + EmptyBatch, + + #[error("error decoding v0 chunk")] + ChunkV0Decode(#[from] ChunkV0DecodeError), + + #[error("error decoding v1 chunk")] + ChunkV1Decode(#[from] ChunkV1DecodeError), + + #[error("error decoding batch header")] + BatchHeaderDecode(#[from] BatchHeaderDecodeError), } impl From for Error { diff --git a/tools/rust-proto.nix b/tools/rust-proto.nix index 7f112f759b..949c1b4628 100644 --- a/tools/rust-proto.nix +++ b/tools/rust-proto.nix @@ -117,9 +117,10 @@ # SEE: https://github.com/neoeinstein/protoc-gen-prost/issues/61 additional-filter = "-not -path '*cosmos/msg/textual/v1/textual.proto' -not -path '*cosmos/msg/v1/msg.proto' -not -path '*cosmos/query/v1/query.proto' -and -not -path '*/proto/tendermint/*'"; fixup-script = '' - sed -i 's/pub struct Validators/pub struct ValidatorsVec/' "./src/cosmos.staking.v1beta1.rs" - sed -i 's/AllowList(Validators)/AllowList(ValidatorsVec)/' "./src/cosmos.staking.v1beta1.rs" - sed -i 's/DenyList(Validators)/DenyList(ValidatorsVec)/' "./src/cosmos.staking.v1beta1.rs" + sed -i 's/pub struct Validators/pub struct ValidatorsList/' "./src/cosmos.staking.v1beta1.rs" + sed -i 's/impl ::prost::Name for Validators/impl ::prost::Name for ValidatorsList/' "./src/cosmos.staking.v1beta1.rs" + sed -i 's/AllowList(Validators)/AllowList(ValidatorsList)/' "./src/cosmos.staking.v1beta1.rs" + sed -i 's/DenyList(Validators)/DenyList(ValidatorsList)/' "./src/cosmos.staking.v1beta1.rs" ''; }; }; diff --git a/uniond/proto/union/ibc/lightclients/scroll/v1/scroll.proto b/uniond/proto/union/ibc/lightclients/scroll/v1/scroll.proto index 99b3bbfc0b..fed458457e 100644 --- a/uniond/proto/union/ibc/lightclients/scroll/v1/scroll.proto +++ b/uniond/proto/union/ibc/lightclients/scroll/v1/scroll.proto @@ -5,16 +5,19 @@ option go_package = "union/ibc/lightclients/scroll"; import "ibc/core/client/v1/client.proto"; import "union/ibc/lightclients/ethereum/v1/ethereum.proto"; +// TODO: l2_ instead of rollup_ message ClientState { string l1_client_id = 1; string chain_id = 2; uint64 latest_batch_index = 3; + // TODO: Should be rollup_ bytes latest_batch_index_slot = 4; .ibc.core.client.v1.Height frozen_height = 5; bytes rollup_contract_address = 6; bytes rollup_finalized_state_roots_slot = 7; - bytes ibc_contract_address = 8; - bytes ibc_commitment_slot = 9; + bytes rollup_committed_batches_slot = 8; + bytes ibc_contract_address = 9; + bytes ibc_commitment_slot = 10; } message ConsensusState { @@ -30,6 +33,15 @@ message Header { .union.ibc.lightclients.ethereum.v1.StorageProof l2_state_proof = 4; uint64 last_batch_index = 5; .union.ibc.lightclients.ethereum.v1.StorageProof last_batch_index_proof = 6; - .union.ibc.lightclients.ethereum.v1.AccountProof l2_ibc_account_proof = 7; + .union.ibc.lightclients.ethereum.v1.StorageProof batch_hash_proof = 7; + .union.ibc.lightclients.ethereum.v1.AccountProof l2_ibc_account_proof = 8; + bytes commit_batch_calldata = 9; + repeated IdentifiedL1MessageHash l1_message_hashes = 10; + bytes blob_versioned_hash = 11; +} + +message IdentifiedL1MessageHash { + uint64 queue_index = 1; + bytes message_hash = 2; } diff --git a/voyager-config.json b/voyager-config.json index a28bd0a61a..858a668bf5 100644 --- a/voyager-config.json +++ b/voyager-config.json @@ -1,7 +1,7 @@ { "chain": { "scroll-testnet": { - "enabled": false, + "enabled": true, "chain_type": "scroll", "ibc_handler_address": "0x0000000000000000000000000000000000000000", "signers": [ @@ -13,12 +13,14 @@ "rollup_contract_address": "0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0", "rollup_finalized_state_roots_slot": "158", "rollup_last_finalized_batch_index_slot": "156", + "rollup_message_queue_slot": "152", + "rollup_committed_batches_slot": "157", "l1_client_id": "cometbls-1", "l1": { "chain_type": "ethereum", "preset_base": "mainnet", "ibc_handler_address": "0xbd3f2BCD8f7FbB11B3Ae4fe83451A9A1bF3B1Dc0", - "eth_rpc_api": "wss://rpc.ankr.com/eth_sepolia/ws/864e6497c4508f901b2dbaec5ae848868e2163370ec1776d3262960137dc38eb", + "eth_rpc_api": "wss://eth-sepolia.g.alchemy.com/v2/6PCr1n8dJeYbE2Z9LrXScs05hLTYiVFl", "eth_beacon_rpc_api": "https://lodestar-sepolia.chainsafe.io" }, "scroll_api": "https://sepolia-api-re.scroll.io/", @@ -51,7 +53,7 @@ }, "union-devnet": { "chain_type": "union", - "enabled": true, + "enabled": false, "signers": [ { "raw": "0xaa820fa947beb242032a41b6dc9a8b9c37d8f5fbcda0966b1ec80335b10a7d6f" @@ -106,7 +108,7 @@ }, "osmosis-devnet": { "chain_type": "cosmos", - "enabled": true, + "enabled": false, "signers": [ { "raw": "0xaa820fa947beb242032a41b6dc9a8b9c37d8f5fbcda0966b1ec80335b10a7d6f" diff --git a/voyager/src/queue.rs b/voyager/src/queue.rs index 6d32907a3b..929d9b5494 100644 --- a/voyager/src/queue.rs +++ b/voyager/src/queue.rs @@ -275,7 +275,9 @@ impl Voyager { reactor .run(&mut q) .for_each(|x| async { - let _msg = x.unwrap(); + let msg = x.unwrap(); + + tracing::info!(data = %serde_json::to_string(&msg).unwrap(), "received data outside of an aggregation"); }) .await; Ok(())