diff --git a/zebra-chain/src/orchard_zsa/asset_state.rs b/zebra-chain/src/orchard_zsa/asset_state.rs index ee8824f161a..b2b213516bd 100644 --- a/zebra-chain/src/orchard_zsa/asset_state.rs +++ b/zebra-chain/src/orchard_zsa/asset_state.rs @@ -1,16 +1,13 @@ //! Defines and implements the issued asset state types -use std::{ - collections::{HashMap, HashSet}, - sync::Arc, -}; +use std::{collections::HashMap, sync::Arc}; use orchard::issuance::IssueAction; pub use orchard::note::AssetBase; use crate::{serialization::ZcashSerialize, transaction::Transaction}; -use super::BurnItem; +use super::{BurnItem, IssueData}; /// The circulating supply and whether that supply has been finalized. #[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, serde::Serialize)] @@ -183,52 +180,39 @@ impl AssetStateChange { /// Accepts a transaction and returns an iterator of asset bases and issued asset state changes /// that should be applied to those asset bases when committing the transaction to the chain state. fn from_transaction(tx: &Arc) -> impl Iterator + '_ { - Self::from_burns(tx.orchard_burns()) - .chain(Self::from_issue_actions(tx.orchard_issue_actions())) + Self::from_burns(tx.orchard_burns()).chain( + tx.orchard_issue_data() + .iter() + .flat_map(Self::from_issue_data), + ) } - /// Accepts an iterator of [`IssueAction`]s and returns an iterator of asset bases and issued asset state changes + /// Accepts an [`IssueData`] and returns an iterator of asset bases and issued asset state changes /// that should be applied to those asset bases when committing the provided issue actions to the chain state. - fn from_issue_actions<'a>( - actions: impl Iterator + 'a, - ) -> impl Iterator + 'a { - actions.flat_map(Self::from_issue_action) + fn from_issue_data(issue_data: &IssueData) -> impl Iterator + '_ { + let ik = issue_data.inner().ik(); + issue_data.actions().flat_map(|action| { + let issue_asset = AssetBase::derive(ik, action.asset_desc()); + Self::from_issue_action(issue_asset, action) + }) } /// Accepts an [`IssueAction`] and returns an iterator of asset bases and issued asset state changes /// that should be applied to those asset bases when committing the provided issue action to the chain state. - fn from_issue_action(action: &IssueAction) -> impl Iterator + '_ { - let supply_changes = Self::from_notes(action.notes()); - let finalize_changes = action - .is_finalized() - .then(|| { - action - .notes() - .iter() - .map(orchard::Note::asset) - .collect::>() - }) - .unwrap_or_default() + fn from_issue_action( + issue_asset: AssetBase, + action: &IssueAction, + ) -> impl Iterator + '_ { + (action.is_finalized() && action.notes().is_empty()) + .then(|| Self::new(issue_asset, SupplyChange::Issuance(0), true)) .into_iter() - .map(|asset_base| Self::new(asset_base, SupplyChange::Issuance(0), true)); - - supply_changes.chain(finalize_changes) - } - - /// Accepts an iterator of [`orchard::Note`]s and returns an iterator of asset bases and issued asset state changes - /// that should be applied to those asset bases when committing the provided orchard notes to the chain state. - fn from_notes(notes: &[orchard::Note]) -> impl Iterator + '_ { - notes.iter().copied().map(Self::from_note) - } - - /// Accepts an [`orchard::Note`] and returns an iterator of asset bases and issued asset state changes - /// that should be applied to those asset bases when committing the provided orchard note to the chain state. - fn from_note(note: orchard::Note) -> (AssetBase, Self) { - Self::new( - note.asset(), - SupplyChange::Issuance(note.value().inner()), - false, - ) + .chain(action.notes().iter().map(|note| { + Self::new( + note.asset(), + SupplyChange::Issuance(note.value().inner()), + action.is_finalized(), + ) + })) } /// Accepts an iterator of [`BurnItem`]s and returns an iterator of asset bases and issued asset state changes diff --git a/zebra-chain/src/transaction.rs b/zebra-chain/src/transaction.rs index bab99cc7a20..0f7ffb17c9f 100644 --- a/zebra-chain/src/transaction.rs +++ b/zebra-chain/src/transaction.rs @@ -1071,7 +1071,7 @@ impl Transaction { /// Access the Orchard issue data in this transaction, if any, /// regardless of version. #[cfg(feature = "tx-v6")] - fn orchard_issue_data(&self) -> &Option { + pub fn orchard_issue_data(&self) -> &Option { match self { Transaction::V1 { .. } | Transaction::V2 { .. } @@ -1086,15 +1086,6 @@ impl Transaction { } } - /// Access the Orchard issuance actions in this transaction, if there are any, - /// regardless of version. - #[cfg(feature = "tx-v6")] - pub fn orchard_issue_actions(&self) -> impl Iterator { - self.orchard_issue_data() - .iter() - .flat_map(orchard_zsa::IssueData::actions) - } - /// Access the Orchard asset burns in this transaction, if there are any, /// regardless of version. #[cfg(feature = "tx-v6")] diff --git a/zebra-consensus/src/orchard_zsa/tests.rs b/zebra-consensus/src/orchard_zsa/tests.rs index c74706f9b48..2f571fe8b61 100644 --- a/zebra-consensus/src/orchard_zsa/tests.rs +++ b/zebra-consensus/src/orchard_zsa/tests.rs @@ -9,7 +9,8 @@ use color_eyre::eyre::Report; use tower::ServiceExt; use orchard::{ - asset_record::AssetRecord, issuance::IssueAction, note::AssetBase, value::NoteValue, + asset_record::AssetRecord, issuance::IssueAction, keys::IssuanceValidatingKey, note::AssetBase, + value::NoteValue, }; use zebra_chain::{ @@ -35,6 +36,7 @@ type TranscriptItem = (Request, Result); #[derive(Debug)] enum AssetRecordsError { BurnAssetMissing, + EmptyActionNotFinalized, AmountOverflow, MissingRefNote, ModifyFinalized, @@ -66,17 +68,38 @@ fn process_burns<'a, I: Iterator>( /// Processes orchard issue actions, increasing asset supply. fn process_issue_actions<'a, I: Iterator>( asset_records: &mut AssetRecords, - issue_actions: I, + ik: &IssuanceValidatingKey, + actions: I, ) -> Result<(), AssetRecordsError> { - for action in issue_actions { + for action in actions { + let action_asset = AssetBase::derive(ik, action.asset_desc()); let reference_note = action.get_reference_note(); let is_finalized = action.is_finalized(); - for note in action.notes() { - let amount = note.value(); + let mut note_amounts = action.notes().into_iter().map(|note| { + if note.asset() == action_asset { + Ok(note.value()) + } else { + Err(AssetRecordsError::BurnAssetMissing) + } + }); + + let first_note_amount = match note_amounts.next() { + Some(note_amount) => note_amount, + None => { + if is_finalized { + Ok(NoteValue::from_raw(0)) + } else { + Err(AssetRecordsError::EmptyActionNotFinalized) + } + } + }; + + for amount_result in std::iter::once(first_note_amount).chain(note_amounts) { + let amount = amount_result?; // FIXME: check for issuance specific errors? - match asset_records.entry(note.asset()) { + match asset_records.entry(action_asset) { hash_map::Entry::Occupied(mut entry) => { let asset_record = entry.get_mut(); asset_record.amount = @@ -107,15 +130,22 @@ fn build_asset_records<'a, I: IntoIterator>( ) -> Result { blocks .into_iter() - .filter_map(|(request, _)| match request { - Request::Commit(block) => Some(&block.transactions), - #[cfg(feature = "getblocktemplate-rpcs")] - Request::CheckProposal(_) => None, + .filter_map(|(request, result)| match (request, result) { + (Request::Commit(block), Ok(_)) => Some(&block.transactions), + _ => None, }) .flatten() .try_fold(HashMap::new(), |mut asset_records, tx| { process_burns(&mut asset_records, tx.orchard_burns())?; - process_issue_actions(&mut asset_records, tx.orchard_issue_actions())?; + + if let Some(issue_data) = tx.orchard_issue_data() { + process_issue_actions( + &mut asset_records, + issue_data.inner().ik(), + issue_data.actions(), + )?; + } + Ok(asset_records) }) } @@ -130,7 +160,17 @@ fn create_transcript_data<'a, I: IntoIterator>>( std::iter::once(regtest_genesis_block()) .chain(workflow_blocks) - .map(|block| (Request::Commit(block.clone()), Ok(block.hash()))) + .enumerate() + .map(|(i, block)| { + ( + Request::Commit(block.clone()), + if i == 5 { + Err(ExpectedTranscriptError::Any) + } else { + Ok(block.hash()) + }, + ) + }) } /// Queries the state service for the asset state of the given asset. @@ -195,6 +235,7 @@ async fn check_zsa_workflow() -> Result<(), Report> { assert_eq!( asset_state.total_supply, + // FIXME: Fix it after chaning ValueSum to NoteValue in AssetSupply in orchard u64::try_from(i128::from(asset_record.amount)) .expect("asset supply amount should be within u64 range"), "Total supply mismatch for asset {:?}.", diff --git a/zebra-state/src/service/non_finalized_state/chain.rs b/zebra-state/src/service/non_finalized_state/chain.rs index b4dd57d115c..2470c286575 100644 --- a/zebra-state/src/service/non_finalized_state/chain.rs +++ b/zebra-state/src/service/non_finalized_state/chain.rs @@ -1751,21 +1751,22 @@ impl UpdateWith for Chain { for (transaction, transaction_hash) in block.transactions.iter().zip(transaction_hashes.iter()) { - let ( - inputs, - outputs, - joinsplit_data, - sapling_shielded_data_per_spend_anchor, - sapling_shielded_data_shared_anchor, - orchard_shielded_data, - ) = match transaction.deref() { + let transaction_data = match transaction.deref() { V4 { inputs, outputs, joinsplit_data, sapling_shielded_data, .. - } => (inputs, outputs, joinsplit_data, sapling_shielded_data, &None, &None), + } => ( + inputs, + outputs, + joinsplit_data, + sapling_shielded_data, + &None, + &None, + #[cfg(feature = "tx-v6")] + &None), V5 { inputs, outputs, @@ -1779,13 +1780,15 @@ impl UpdateWith for Chain { &None, sapling_shielded_data, orchard_shielded_data, + #[cfg(feature = "tx-v6")] + &None, ), #[cfg(feature = "tx-v6")] V6 { inputs, outputs, sapling_shielded_data, - orchard_shielded_data: _, + orchard_shielded_data, .. } => ( inputs, @@ -1793,14 +1796,35 @@ impl UpdateWith for Chain { &None, &None, sapling_shielded_data, - // FIXME: support V6 shielded data? - &None, //orchard_shielded_data, + &None, + orchard_shielded_data, ), V1 { .. } | V2 { .. } | V3 { .. } => unreachable!( "older transaction versions only exist in finalized blocks, because of the mandatory canopy checkpoint", ), }; + #[cfg(not(feature = "tx-v6"))] + let ( + inputs, + outputs, + joinsplit_data, + sapling_shielded_data_per_spend_anchor, + sapling_shielded_data_shared_anchor, + orchard_shielded_data_vanilla, + ) = transaction_data; + + #[cfg(feature = "tx-v6")] + let ( + inputs, + outputs, + joinsplit_data, + sapling_shielded_data_per_spend_anchor, + sapling_shielded_data_shared_anchor, + orchard_shielded_data_vanilla, + orchard_shielded_data_zsa, + ) = transaction_data; + // remove the utxos this produced self.revert_chain_with(&(outputs, transaction_hash, new_outputs), position); // reset the utxos this consumed @@ -1817,7 +1841,9 @@ impl UpdateWith for Chain { self.revert_chain_with(joinsplit_data, position); self.revert_chain_with(sapling_shielded_data_per_spend_anchor, position); self.revert_chain_with(sapling_shielded_data_shared_anchor, position); - self.revert_chain_with(orchard_shielded_data, position); + self.revert_chain_with(orchard_shielded_data_vanilla, position); + #[cfg(feature = "tx-v6")] + self.revert_chain_with(orchard_shielded_data_zsa, position); } // TODO: move these to the shielded UpdateWith.revert...()? diff --git a/zebra-test/src/vectors/orchard_zsa.rs b/zebra-test/src/vectors/orchard_zsa.rs index bffe300e73d..d87723c3353 100644 --- a/zebra-test/src/vectors/orchard_zsa.rs +++ b/zebra-test/src/vectors/orchard_zsa.rs @@ -6,6 +6,7 @@ use hex::FromHex; use lazy_static::lazy_static; lazy_static! { + // FIXME: replace with full issuance workflow blocks: Issue (1000), Transfer, Burn(7+2), Issue(finalize), Issue(2000). pub static ref ORCHARD_ZSA_WORKFLOW_BLOCKS: [Vec; 3] = [ "0400000027e30134d620e9fe61f719938320bab63e7e72c91b5e23025676f90ed8119f0277a3c364bbcfffcebbfd7dbfafce1b511f5383649e84bba9c598f7657cd73f840000000000000000000000000000000000000000000000000000000000000000f2fa494d3fa60c200202020202020202020202020202020202020202020202020202020202020202fd4005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff025100ffffffff0140be4025000000001976a91475dd6d7f4bef95aa1ff1a711e5bfd853b4c6aaf888ac000000000100000000000000000000000000000600008077777777d80a1977000000001c1d1c00000000000102a2ff8960630dce65b22a0f76907140d17fd2c4c6046c71bcf6a733ad7a5fcf273813c86092c0e3182ddc16bfd9c2bf7285afa4353ffd559956f96f8d5b4f4f2313e7bd689d1c16203fef2205ae6ecf774cf27a2ef1e8f2b35b1eeab4dc6b5d0826527f08127c5a32a88e3b26f5b6ab99466831a4f8475b42463589c82adb1b2e62dcd87c5082075e90adda78559a4b24f5e3bd01af74a08402aae8e8741ac8a33ea8291b2fc8cca7f3da7abfe174ebb2f4739c6b002fa92ce21b4ff82364df00b80914cf1fc14caf3e1167c42549599f2beb086f13784c6f4cd1b669e5b4d5d6297d4e21a4522364fb5d40af01c2cea0665e01a6d688737880708f5171d20738d63765547f466c8450490353c3be38ead6a969c060106c206e9651593abc2a31812c7ebc539711f5c715829a007928fea28a5a7fec3535b1fd432ff10fcb4234f26a31b40d986f1acd299d837aaeb8679d5aabe55d48db849dde1228edbf58f0c112b7b8d88b5b6ea7d5aff19bd5052e61ae769f08274a823c9ceafaeb5e0c25df1e1d85cd09ac98e5dcfe93f030c14bca992228a080e2972c2d9a62f8740b276d961b1dd35760c15a875d202a683f80363e10422bee4205fd5ff844ea7dc5f85d7ff65fffdca20f561477c63670130c747c472b7e78948607b46813a3ff23713c1ef5242bd2ffe7da348e7dcd50ead0efe615b83c504fcba6a269f845860086ea0a4fbdc6fc3bca86108130e23e0718cbe243fe03149be581959985b625988bc69a05dea38799c808b73d31f56dda38908e5757daf3102bf9c16add05b0573aaa12deff608f70891471a8c7de008226e0d283be8f6e689d606572a6b9a0e16b10d956cd3c79f6051a2e3db3188ea4b7bfe9475a949d9e2fb9ac9082e96476f46c8d5924afcaccf68029d03b606dd56124656da348eae76908b5850a527b255fe76146fb511aac1d009621de6da7ca342c026122a3a1d4a43b126e7973a74baf788b5add8a5dd37db6b9f2838682d1a03b536c418519ea002d64645245724c4d7bf845ac47ba0f101b9cc7c9ae706114fb82f16523c067adafa04c98eb7be87361f42ae60b519d05d42d8a437be36fdaa7e86b2d9b58442958b3c4787dc81eca15ee846bcb5132b9d5a0afdd1a08ef417b7e26fb6a9995e43e4b8cb2b1f9c8a9f283f6fa03745ac675886b14b8bd5be66bab0f8b30d52edcaf76f8285bf25583048ba10e5f80b9f541de0ff62905e9d2dc195b3a5b039bb263cf21b8f244dd0f96a1e580e24fa31e46db5f1d5fb455ca57b50b1dcebe0504ddf3bdaf06bfe117a5b51678cd762dbf709f752f6ec9873c04ab1ca6e3f0acca73fb4baf1fa2b379bbccdcfa13d983b05dd541a80b3795a489c83a1f7dd7dcb5fa31bf2b3f554dd490dac8b2f95451ba7ba7c109f024817e2b64732fd51af3a041159d958944e75d268adf9bb638a4a51b3dbebb5b5b20bce21cf07250d068e6aca397d95de7bd4ad287bc3798c8aabd57802d2d55ef15e54621ff0cb1e83660281e2c7a6c1c4e2971fd4d3409e40b58bef5ddf96e2f11e70ae893f2539ab2a3c047102e08551660c886ba44cfe98a39d11cfd7edbfbaae0a1a0fc692d5e45d5c0e0837212ab058e1c010edcd5d6a5ca4981ba80db990af2e41eafaa209ee3aadfa0ba3047f129461785577a10c81db945521fa7a6386b6c07f6a319a7e5b74dbbf29cd0e59f9be5aedb764d7593b4c44ba74ba25aba1445ffbe1cd636128917ead385dfaf084991c2fa416f44cf8d6f9bb29155ffddfcf5119d0db3dbe3cf134d478768c607d6f118df2aead2c95557a3aef7fbb4336108ac45e18b8c871ee65b1d75ff5aba13a6a6b366ebc98e8d39fd3f98506f7c84990c28c74789bd80b0070fcc649cca179ebe954cb5b44b0d3f6249c4751877f0a4031016c915c834e7df81756e10a441833fe0b75087bf63e1b76c1ea3bcde997025d9189f7d1c50ac6323fb8d57fabfecb7076950dda510f0acaeacbf14bdb335489c0f56cc67d51274d21734bd1a1bedcf7e98a0881cb1ebd38ad67c61900143731eb7e1ca81eba25d7a67d4abeab48ae063e7d84f2b1ab12ad3938cc43d194d8221b78efd31c972512dd92c704bcf749337208d3ac33af186fc87798242cafa31929b6a50b2c8b6be32baee7beb2ffca22212fced56595855ed701dda8c8e14c2cc555bd55fd5a0fbce67b24f8bdd0a11141ace9773b49de5e24336f9990173c57feafcbb29b3a7707aa857310128a801058bfff8e71e5dbd0245d3640f9d9265b88b41d3f8f22f300c030b98cd73bc96a10e2fdaa9a27c2a42b95c90fcdee72e07ac44865acb7c2db42d1f38fb05055a29cb51c91bcde85393c14fed882b94b6ef496a04e318f1c1ffbbde5c5d7e8b55ea0337bd01a69907ae2935f1dfd8a24aed7c70df7de3a668eb7a49b1319880dde2bbd9031ae5d82ffde01c742f816fd3d4577b25b0596a11a98fa80ed8a5d6514569a205978f6d1e62530b22ace45576c2d3c4cb48a14557dbd0db404660ad168d22be245816224bb57b3a325c24b06c7076f8a4761fbac194e96a5dcec14c19f432bc0286bca0364981a48a72cbffd7184306ba0103ad72a027b018138eaa811f88c8494f4a9a5e3cc3a41b073d97daa4db8ed3b3db9343a48cfaec7354cc4ef39b7c9cfd273415c05a1fbdd19fe1a058a3bb6b671fece03026efc5bc71e91d8f938b6ca46c8f6c9580a1b02c9971add1995d43ba6f09e7f20b0f54355cd0c39be7d233ea9c4296a8ca0c1a12457db2d2d1164c17e73fc9b3ef735c5fbe4fd6d36b9994b545af622552844c55bcaf70af05920a65323206da4b8a2656035bb886c267903baf9cf53409a71a8aa6c48432c0213bedef247db020c08fa6267ba4836af30f1053133a5676aff95aa67de32ff028755bac570d1aa875acd98f0ed735fa24efa3526f18374396d4cb46650c66119db6f8a3eebd6ca20d16aa1933d0fd5b849e51d9ea0edc5635c412df8d5183ec5824041dcc7cc5427593c997a33a6e2efd6fb71101d2affb841e7872e42bcc2cdcae31d991d20cf983bd88953944850f92f9a329ae4f43569e71c20d71ebaca83780f3244ca8285e734f126fabdcf8ed4ac1063fca3d6bae27cd387759e515b7299159c0513490ca6b5f2926f81aa5e4b7d016a50501c4060cc8db9681a302ca6cf848a4b4b855009e13265e422c45a3027c756b1a4fc979b4bb2802cf032a4e025109c4d25023612589ac7bb54a1e90d38dd60f347d7eb29390b4223cb912a80727b688291e8a17090dcd04dc4e9af03ea412b06d4239f300518650233290df9e070116ae1233d595fcac06cc8869e223a5655ca8b17c1cb264b4b2997498a0fd20f2862708d1bf1f96b8714236ac8ce9bb558e22460bbc1eab124d73547a5055899539f29ff25f66a72cdc8528ee77de6793fcee62ef211857f494372c55371147595407d3540461c2002d29b14e6d164ecce50cf39d2a370fb9455a73dc1072498c3bb2b35346da9be1229923d34ac3f9935d6ab494081d38ad437c514dec7d08d37f53b029f4c6eeb5f06e7860ab48bb8bbae2770637a31dd57f8735c9a9dd32e20d57d3ab2ecca9de98a59ddb9a7bf2817b0f73f62082e9fa8b9047da395cdfa7d577e8e874b28ad1ddd37d9e1309699a0199b5a054018fd051a175859ab286575202d5518fc16e72b124240f2564cea47332087711804ad5c79e536efafa3ebc65676acc28fcc364046344b437071d8b739fdc2722ad66a4d716d545e0e72392ccb87c488fd12ad01d41107b84d1d4023d3ca9dec9890585b47289d2fdacbb70d6c0ea3eb850721e8f43e54f184f5329cd318ad8100ff7d7654a694dff05306b073caeab126635a7c98828c05cd3ecc5a31fe14b1f20474715b2a422fb8aeb6dd4c2452c9740740d8598f101b8bda65cd789c57c0818eea93794193b7dd98dbe48b1564487c6baa00849e97048ec05bcd415f2b018a5fa4a8b9cfd9768a8c4c751521965c873e5b9e3f4e9d021a0f291848a75ab9f0a59f79a8e7b577525bfc8c741d759e8f076fe200019f7e2b89e037974afce5f019fd9ebca0d81d5f30e74e1f755c938e2783632b0caf961ff5754f640ce99e39cb572a527d1e514e883d3a02e7f27cc01c7f50f395c282bec3743947965f3ab868501ce9a66fff6c529851b5cfb1c3cdacd2b14d8fa4b8ebb8c2c10da86fd05ade39e8a347735a678bb84fbd120ff8083f353da614746473f55ca04f1566b72acbe76bfbaaeb77759d01d87c8908101a3023c38221f0ddd2b8163be8d4320bbbacaa64f819e5333e9adbb37d80b00d5c73766940affff85c965d829655c8f8386bf80e2b1f2d4ac6ac1cca0d887a42e9718ce598561ba106d180dcd805978c519a354a84c5911f3b765bad79b6d40cb0968cb0e7d0f166557ad557c000509b839c72eb1028c3344934aabf05b4ac70bf1264025a6b1ed5be2225693e120aa1e01650a64e0dc7fe017718c8dfa04b0c9596ebc25348ac4869a2e15f7446405ab894ba590a6e255f7de3d24d636944796db61ab391de28ff3abea0a49104128688e1d56753bbe62a8e1dc1bc53a63a2ea3ea0fe3aa83b614e9f4e9bf1b3037f0f90adeda7e3da64e842a2c04a0e50a1d17644d96d243ecaa240b6d4be0db40d0711a7772c9645be5d2930b343ee6002c8e8592f15a405354b070d6ca3a38a76979bd2fa9b73730bdd379ecd86e1bc314ada63df86176aae61e4685c071299ac4597a4d914855d98b6953cf61ceedfee6119b8b11b282523b1173a1bb7807568f7b3d691c33f287a3bdadb55c493db4d8d733153d85cd1b3133b891b995ee44e9993f5c61b832b9a49f716cb5db316c7a689186d2b1843c4637bd06f8aa99eb01b2a6483c9796ad4aeab3be6757309958076410d6074adc681ff3cf08a5e8a41ab246c36fa11e75895751d3f1ec1a50ccea73fde458a529285cae9239228725c050f01c26982b7e701bc19b6d62502ed1775733b7fe59abd623eb24b2eb997f9e10dc2ee5130bef77a341f9326f67e9760b860965d7d0c43b8713cc8d588e42cc42181c2e509fd4a801f69ee396f918e8ec203f03a7ac335d5eb9e7726dc18a45e2ae9f7df60d0f15511c481ba90d9f93b62c703426dabe5d71377cd3f64570fa820b49193ea811a87c14b63456095a982f4a902c219a16f586c9169ad14a233352aa613537628f57ef98655677cab2511e51f574c85b98e7f48c5dfb17582ebf61710023d58f2f51365ab055204b395ba22c94721fbe4a2d36f16c5560b013b24383c55a8462e8c17b6741658ecfa2b111d978de5d39531ea9348d8238b8c91a505d8be0b2e98797b67ac3aac00f47d5e797ea393ff8e9339100c60c4d88c6314190db8459d6a3fda778fd490abaf12e4af8269912a07a5a76baaee16f0066eb52ea8d27118b66418542561b3037550a1e45c4517a0d4ddddc745079fbc3ccc2e370ef0228d783380f658628c8638562d3a088e162db4b0794a3f6dfc067971cf0e566257fe5e7c01f34bc90925329048a64021b99e1e0911bb4c00ab58bcd6b434aaab7f740081cc2101e863f989e4d3831de276dfb3b6b88d880c2405b673652afe49c995fa3446da29b3547fe7f6410fc4eeb2c7a5fedb660a318c1bbde4a52038f76e708a2429b5827c8ad074ef716f94683014bb4dfccbbcc5148cd3c2743f4b000f7d807521f25ba6a83dda4ca4ac7e49292dc3715c698f425f12d42ba10a2e2f4ad8dd9bbc6f7395bbfd282b798e643b7b6f10aded7c14de6a9c752c0918f7cf72e8da82f1bdaedd25e5c2ffd6e6fa2603a1290dbdce5862f74d78d49b36797ba73f6bc5800632bfc79f1a740b2e7de716a491410b55c34c4891004aec134eaf5552642552a39de1a962cb54882bd07d037712f725bd2f0d4dc7200d9f0349fd0a864006d826042114bbaee4b26409c7a2a2d772067e30d24a1ee3bb55394c8a8dae11b4b6585f1505e0dc6e0227020e7940a277fa6588401825fcb6bc056e9e2adf5cb860caae4dd49a626630c7b5b836bf0823c09780c3d4163364f019f72a44e04bfc5537d7388abf532f132caf8a2a4aad46ea37d56074fda205a52f9ab3aceba244b247152b7df5e90a70174f0425ac487157a845de84db2200ff3914ee1bd3b70e02530a82b497a1ab4e37bc783afdbe961c1cf61f1dd8ca66f70d7912e372e519788cd4389cd8113a147c079ca214a27e55890517f6d52ffac83e1ce30a31931bee79f1d9a040ba7f725186285a7dd238e61b4ffdf0a93e92f6370a3ff318317dcd2c21c3ca1ebcebcf239268ee5b1e514807c9f909f797f049161245db076c0cde8ba0d9d2f84b6992966a2b2ce24f8186cb6fa80d682359ac1f52fd998835bc9ecea6d9a268357efc2dfb1646061cac40b590360d48fe7c9334663f9110f31621363dd78e39640f8cbbd349cda0b3ac24a8d4dab435e77fbc27a0d4dd9a9718745888e22ca8f8f0737705abd5843317ae8e84a593505f6d7328bfd1858f18ce04df6775df468f419d4efde965a6b6bbbf1cc5efc02f5017c91c231ecb21419597141fe2ded1eadcad6846680a701444199733dc987556e37030cc79460833cb3393d10c28eac8c82fe8049b54ccf08e44060a7842388294d900f9360fea35ddd4d79823cfc59946044b417fc849134fc80c30c2bb9eabec4e0567083c996585b3b0ba0f145ce51705c08f847ddfb5a702dd33cbb302148aed1f0a00e6efc0d0fc9f69ba8be6eb666251d79150e6753b491761d34499437ae82c2a125987259522c6e767d7bc34d50f0bab103c7a8631c09c96db0da4f392551cc4dccac3496feb6f8e48d18a836d3b24aa6edf1530e36bcc8749b6a027c7950b94f548b7f9d9e0c4f442fbd6582fad3de180924df9b12ddf74124b3705ab07250deffc12cfb5df201098ed40b8699aabadd99d719e8077030839b67516be6424bdab583f9b560d430e23bd871830cb22ad6017b3cd388e3f953d49ebe5b0dc31d70d9ebe76678e93676548bc63887bdf4930b9e3b1f8baace7d7898578b44e2810906cda4763df23c58bd4c961bd3a207b58f29ca339dcb9006f61bdfb2d8604bdcf6a2765216ddbd51278aa93d51e7888fd3f48f4232ed844d83053ce9a2b24dfd32a888c7a2a22e34c395de59a48ad9e4c2c231f46ab8b4b398b7af4c6200986b4e2b76a692f9758d7f2484929d9d426963b4e7afc83cc57a473f213883a2c0321508042ada0974d814471fd2035adfdb276c239fb022e06b8c60dbc20463a2d9a503ecfc8997db3ad3b418a76427a9112dccc929adb7d7f96f936f4ff682f349dac9e90f5f0137aef9fbcfb55e2d90afcdf89cf22974e2fb12ae9bdbcb317577e5acdd09b9f4a50a079d81df814995fdb5f6fcc973942960ebe9389acf80fdd9f362e977972b176c6c60d7075a17a69f71582d634b121a7cf84221568522a412cb45a3fec7371299e21a21dd30d3f79ea4d1a319189d796ca081e85c8703f0ca40c0074f6384313e414f1be32d3d9318e0ef9669804749c8261037e91252662fe3d00bb6ba89fe8956435b8b0921d616bcb36e16d1e030e661c9b84e8d42ebd56188be53e0d73d6ae74601358386e7857522dbb0e7d830c4a89469733fa1871d61b57abd0c6d7553814affc3d05ee78300fe17b181c672935ab2c312224215056880f4ed24855f04d249a8217200d2f605058401a560141fb7c018d5e21124880fa2c5757cbeda13589009ba7d88f34df269aa5f17d0e15722dd561ec263d79e8fb679c9e15748a78681d0b01947d3e0c188049890e11ddf96bcd1eaeda188f03f6467f0e910e70e4448101f5fbaafd54e57bef17c2068b545d897b3b0402f33d7782639eacadad62cf8f54fd8f818984a21744f339136a6f4260cbbded0d2ff06821cec3519b580da06d271ed1724344bd7d1b2ef8544ddd6d51d4b0c531c2b3a8c6fe58f98b299ce78c156bb6d39b0046196c97668bfbea341ba8fd1833cbb99840816b639acff5910f91121e95e41bd6f16f1413f23fec512b13aa2e29ae67980fd119e08a73b8919ba6cc11ef1eea54a2842eab3cd198a9a1f67751066fef6c767fccb12496c609637e66da8d50ad8acfa1a3ce00309be759cfb3c825b522831f76b3a430cca00cc798d15e9f61d51acfac0101ded370858648426f1f2bd33dacf5c73418d6be1af10d55e6ce31ccc569ce6ef18d314f5fc67e20b701f2301bde1f72402cd798a443e8243bfe5d7a32b5fc0ce091ff37ee5b8abea7052044a394f9db1784d4bb3be437d9b5e8ab4aaffe9a8d38107ff14f592ff24a040198f7e05f963fed6c50344c6c7d8144d86b88435ac5e81320f351991ad8cf22e6648cd7496aa08253cade6d5520747d4fe563f4568d85a2c416799a1e48fa3370fd61e17859363ae697d634c5fdc56d4b739502ac436d9483fa6ba7461f6c1d7fb640a9d4d092483f2e7f74ca2c5a37648689c81a0db22ba2b7ebdee5e3833fac4cc27881d1ae46842e4c930a6588a2da269bfb89abc3dd07850f252745c30f067921f1c8f7625ef228725ddb1b1c1ca2228863e5a5459d068894e60e87d508637fcb7c8a76344df92aa5290b8992bfed9714c1c000e93304b39b1b3697681fa0a88d4ea1df334a19e38e180d8cfd58e189bd15bb8f32237dd5bb1f35b6f7051e2063ad81658422d8eaefe681257f2e69e734a7e4077f2665f1ccd669c8a72b87878308d38d8435ff407120c6edf0edd55279e559f6f9ec8e6f07cfa68f33271a073d5cdc421473e468cdfd20e59abcb97db0efc674ab9d4ea68c6a0dca3b38a6d02585c3296b953b28cedcd39e30503a2c1b0f5e7b389e1d8649264d9a5f01f0623e75b524bd642bd765897fbe378b446fb9347ea7e877cbcc162457d3f435b3bfbcb9a54e86c0d666d737e7f608a8390eac1ce8cab7b8f8888609cc279d0ba9e5160075504f22f7cc08d307d0ba5c8c16705fa8d4d0ee7935ea0c3d5c1035898ad9bea0d1e300e88961729ca63397252994f10ade528ac6d4cd01f0729e18a2517f6b173d62e10ff033231892d23372c303f3666b194a4d0f1c30bb54312a9dd5b20746e21226bfad804c9e6e5587a0fd475a9b0bc6568852ec0d402c6d3b10a58e01ed05f009f6bb9300be57749a1562014f5af7576e0c059616ef1bfa0137c76c2dcaf05dd19063ccecb9260190fbf5f7807f1e57dba007662f5bb45b129483e9cdefe973ee3ffcd0d962fb97ee6e85f9c99528fb00726942d63839d70ab2a516c6230eb1fcb81a9da2dca561b84f9939b03b27d16f5d1067d79e322d049a3ea587692091d63553b31f68fc00620b2241901d7b401355e6798e85e3d311ae3b43c5b2a2371d56c59a9b06370e47fe1e506e307e28f77ded15be85519c1e9cea65507538310cf435f65c3c28a4d4dc7b6bef573354a273a305721f30931e249429c48f06e298f9e6cb164045ff26a25041de30c987e08672232b83c035207e7ff19a59a4d1949bc1a55854b73eb88123d9fc4e6d7e83c17792574d2436009fc72af85ac544092d904fe0bd094790641d1cb209e6ca3a7c1c88e97c4f373f910912cab500cad5a139e522b4f6b2a283dfa673a221660a7d4f833e1234cd1517675538ed32f71af0d821649f7e86bd14bd84ad8537cdb87f781795952e1106a5719f95c027da3c6c5daccf3e16d0a4edd69f98df869f9f7d7f41580bbc8200939764f56731ce1b892a0c8bb511757012598bf1a61ba3d7ff35f2702c1afa356d2b5bd334bf7325954e69223a70e9d5a43b7ff58e37c4bf0395d2bef8f12634ed0af02550eb7b0079664132dfb206803f172709418cdf7185a22aafb95b7c174dcb55af2945cb1f6dc173b4b3ace1c623712e3e3aebc551f522ea8cbf49ed112966bb281e60dee44e4ad0497ba489dbec36ff797fa49d7797890a9814e45d166e885187b8840c97c8184cf4a6ec4eaf8bedb1e026d6725ece4339d439b1362a1711ed7b876dd973ac52065ff2fb715cf306edb83a2144e6925e7c41410cef00b75fe21aa93e8e8344acbed670559a4f70a0ff173166b8afe6e8c712bc58ac3a10647fe5d1a7aee04f75c5f19a235cec4dc68ad969573da2a76c9c17d0863030ac1b90715c44ef348a028c82c9bd193d45234ce67c4e521540dd4a3f33a854024858823b193f0b945fcd56fcef89214e2b30736b36da974da0e136b979b8ec217ca5f22616d2faf86c5c857c4b0ee9c34093385aae05b849dc957eca44f77b0419d89b5479fd92e3af00a8b73b5df7b921cfc32d3f7509acaed599fbba02673220f58a0fbf25ed435f4cdf72da033d38cf43e5bbb5c21d4f997574ba25f9b83eba7ffc523d301824659f0a55ebf64a0d47bd2b6f4174272514667e578fd24f3a0f65f6d9ca1f072e967b60501f080c48b9f3bb203081e87e416284108e800e02646b6968dc0171db2909fbc65b72e9a086ee66dd22c0b1b32919195de2120211de22996cd2478a1881d8b275c4234687903b8bbf3545ed00368da88c3ada482472ba5b079e656686603debf75be6e770a2fe59dc6bc642e537cd0d55b29a692e3aba99a99617c4a14297860b0ad8aa72641cfae8842689641de7a79d6ef11d1e8e0b4d50edf2133b35da83567bb9ba6c8d857edca269f93848637a71b131943e7de3a9d13aa6bf39385c4b784df25d18b2e2851538d5961325083313dea0e61f264faa85a95c2b92842fb34179827d95544c5ecf68686fede2f796dcd6fc0204dde1105ffcaa4fd3f16c1a36a2364f0ec6eb75262c0501d183f7f0ee583be306024a36131101e4e624a22067ad9439e40a3c4d65ee220a8097ca372a2d4f9d22a390097ddfde007e97172160bee326f60e711142aa8a2fffae58e9a66a506211b3b9b173731f574ef346a487dc44bddb47fd7dec71a3c5362407fd69d991b024282f839773e9d9450aeca49755795d376d984b086186e9f2d05c1b0521b6d431b241e66a8026b0630ee80d549669ee5ed4c69bcb560b2919df40696826048708f61742ddf6f90ea3d5419bbc03a74a1a056d12a5e2d33a0665f4f5ad067ddd17f9a13ee32b4a8ee7562bedff560e429a715216428188a94d8eea990afedaec3e58cd294bb394672665a7ce79aaf4c0b35d4f12212b4ed5883b6bf2b2b67f05223f3d64d0d9955c44bfcf728da216ac733b6d55db5bf813e6f1b12c530e149513a299b27b5ae97926fb1e24b8c842a4d79da85832dd51b826add0f9e785f77200059841adb6102321820d09003fe4d02b181adfaf192564c6cb62d1852e91e5235f1c67acc7583ceedeac0323496b87bde74cbdb3c20a7319e371dd2cf2346f033333ea9db5f34a222c6741b06fd6bff4c6d716a387e1107c95bddde12dc5803d0666a734cb67c6be3d7cbdc3c9373dc8c889339a96db013517235adb4affad10f3dae3abe632af4684821a1e51b4a762d8068f5ae3424ce5bcd6b898bd77172ac18aca07c8ae53afe857c885a3e0fbd1ef9ceea9411695e813c0efbec06e65ba822a07c362457ff5e7f173399872b4d182a801ba6ef88430b1ad684caf28b739ba379b95d56fbfc2568c1f53d1c739f93288d3b5dda68e99fbcc5ef8f6277f170d4ae0d39e58f8add9ab31db904815c922f459d55764e12cf9fb880c5353c03d162739bdb8c8d874c5c10c6707536c4a55129675a64eca5d3c010f65e00d1f35ecf7a04a498d1b5e444a896ab3fe798cea6fc1b2ef5bd3a7a8600fe2887df1161cb6f83ff4fa94b37906a94f2d2add9a1aa17b0c3f2b2be03fe1598d594fde2ec005db41e554b4593dfb766fd366df69a8b443d7c5681dc1fb068a4b450c43809d895a9440197d5fc9df550dacaf0d70bc069b292efd92559fd373040b2c6e96a8e43ec0647fdfbde5b85bc4ae422d7076b046cd263bb027636e0b5d7e54e3364fa412533eccef6dd6d5c2198fb975cacd89f4e7887d62778e888434eb1c522c1ad335e8400401fe0bbd34574733cf5e4c7c50b104fccc0cf26fb05ef5ebd426c859c574dbbc06dd0960b916b20400d8361ad8969153009afc1006fbe36b0d80372f48fcba350a73f720b03e6c822bab6faab59f3b506bd2af4409a6dfbf08ac68da3a89e9a260160c28c868650cc26e4f2488e56e29e15ded3532e4d97e7287a6f8e8ba508d26174e67e556c8c68ce540c0f50dfcc87a58e9d6183cb1e506bf527aa3e45319c0e2a32f38f42d7453415c0f99aaf5cafa5c9076256b4a88d5047adbbb7dcb2cf37bad183982f4d6c2319208c7aad46d85e9c26b1cfcc330e0a69300688c4acd32f6dc33f7215dc151150147dae2b5c35ec0d83fd2b3ad6562a9b4d085b11cde126098bf5ffd9c921cd52c2fbba6f2faa73d00dd8bc2f9785ab50efccfa959788ef8da1ec36f5e3315d9b0f57d9f1d69effca84b486e816a5930d7f04bfe406d8438e8dde21fa2a129d5f44d9bb295e40bc2db710d85781e4faf910a13e44696c52b262d551a906f8eba19a4bbd51e7e37af016c30f89fa571a075f997a873f66a93c545ff2b125f5d03e3247493d6dfdd1cdef5307046b88019744f2b23d4f85310d17d375d136782ad31edd902098e743853c67738bddca3855a279784250e4856a241f01327c9488fc7a1618a429c43a4f6ba1ae12c02ed9bbf4ef905fae987231165c02399ceff808d014854dfa3a66cf1b6dbfb5c68381a3b5b4061f0e15798ea703d9279ef9b66b87c80d105449197813163c928f4b79d602ccfc541a8dff238b11255abfa04af1d953c616a1586de94ebb9180b834b917b8ec6932806735ff1bfd0c4b37ffe1676682d82ba9a4b4b5c220497df0baf310ed402f437f0f639b8d31220f7c66b06a1d97a698a15192e6c4b37df85c1172200000000acc8d23a887cbf7be146db10dfaf7e99c394fd6f215e9c236aec521efa9f2403fc33000335121c9f39f4702f34ee9b079215362fa8d50098374852443899cf0d4fe60aa420202852a5bb019b444c161ea6fb91472fcf60ceaa0c1b3111a4bea0ba3238a615772264d44a6447412b0d2e7c916d1fc2b9abc078d6a247dd90413d00000000000000000008df299d0c2ec594e58b66ed6082dd86839e02a7e39e61882f029de595122a81992b3c78218f2f9a7a9b14a53ad6d7a66d5e91b83e64acf921272e8a0c06ec0701045745544802cc36601959213b6b0cdb96a75c17c3a668a97f0d6a8c5ce164a518ea9ba9a50ea75191fd861b0ff10e62b0000000000000000047c6d3fcbea6cea1ef530150439cde787f28ad6e861bfc8a210a885ecc243f910cf708248d8c7a767ea822c7bfe644631224c027897bd3c55c5c4fb764a79b2ff2d6c13f2a7f5cbe9707d26d7d7ee1397f6358d324a24d55cf3c5d5992528f4f2e7737d14decf060bd7be5a896d18fca116c6a15be55f04a351fa3dd4c1e5a420fb8226555e678e9e6f41fe80300000000000047c6d3fcbea6cea1ef530150439cde787f28ad6e861bfc8a210a885ecc243f91bbdf187efea2ae6a9090cf97c682c897c105c3f94c6a4d291668e3f24db61b1137758feaaaa99b1d18093c24ad369e43a2f9341113c4d2af873df5b0427b76c200d5e50ae1b41c0a64b43bf7b230207f12ee69ae9ba16fd653911e1166eadcf78c53115e512a15ade568aef3140478a92b612f91cf622490ebd82230bbc4a21130583ddbe385c01c68669b1b6c1da6e9d40a17ed21dca5962d25974c9b5d5cfa26", "040000001183ac9df4a70bb97b198366e50b570c5cddc16fab0ed1d8031b6717aa61f9a46d07c8f627f0329ffc7353da1b2bd5ef58b9d2bfbe63793d6cc38c1c13344bbdffeb2e6ba29e2211d3779fdd4f0fd08c54ab63136425b35a2f5dfa36dc1218460a104a4d0f0f0f200202020202020202020202020202020202020202020202020202020202020202fd4005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff025200ffffffff0140be4025000000001976a91475dd6d7f4bef95aa1ff1a711e5bfd853b4c6aaf888ac000000000200000000000000000000000000000600008077777777d80a1977000000001c1d1c000000000001021415f56a0290cb829352a0053f3173d99ec2a607ca29820276aba6020e29c02f5bb0a2b80a56b387a575529e00085546a130438f1c0b63321ef933086fbc802a24c8e2332caeabe6837cdd5bc3a221330b602e172fb712084eb4a5ea674dc696f2c915237c89cec983ae159ae839ca480529a663944ee11ad80952f38af4e63b353dbc0af1aea41f7b57e5bee68d35f90994143a2821f60d3fcea72fa5f9d61c5cd20d769fb813f5271c3272e5528d9712dd023a34550f239b1c4a5bf8919ae0b8edf0f1aeb840bbb3d5cf5f5a2b415db9bce4e87aaaa37968468969bf8a8ff2bc5ce8d15c3d604e24ef315fe1f57fa3bc05cecc902fcbe9334093b5a963b86fc88b8a797f2fd18d14d42122d66d3377fec273149601004120ff10c5a7bcaadc22f193a499c88f3ad5b5eeaff2765c28b73661333435a480164e6d84695d825816ccca01350b3f877384690fc47ab53b8aad4c5cf94bfae10033d7b05419f1697b41314d9575ab0428e89f056a67c84f7515264eae379c59893b5e0883a4d16106ec6070ef1cdf8b50e508f390c911c719dcb6d132140cb4f7a0f8f8504540d7d8ef5fa0fac6f4c3464c02cf0630810fd16cd301757ea2a617768a00acc53cd6ea2d9effc731a41d9d7df3a0f66004b883e8c6eab85f15a4f5a7fb49027e53b05d90fc598e0ac003a652dc9242f537fd76d73d34ee1231f4060b254bd049573ebfa98659a40d004e42848c383aad6b8ce424e9b80266db51ba39aaf6b5ead6c8697fd65cba7e4b2edf53d1f7b6f5b6367d9e7efa3e7980d29d67a0a136848b08dd258d9bfc1304d0d7f9845fddce072f4d5188ed3bda7c9c3082659bfba91fd562106e4d0fe8cc196fae5fe05481f366d17ac5a5d12952fa42067778d92101db05bcea16118f4b15bc5fb60cb2ce9a2d32bee6e3dc041f0fe98e683e09367e83a8b03ba187ba2a28c57afb4f596752fd8e1b8fae46ae691ed89cc475ce9cf839467c0b273e44b1d4dde8f1966c97b89dd533b0cdea2a8419cd716fb9c2fe40245434b54a7e41b29b31191ab61590f568d2a1d00f87fb327ac24efa2c86e669f867fc1cd279c99815d7351890d8732d43f8174a720ab59f0513a1145d35fc8ef8e969c80fa7c0c25d97d0409203c866f170ace4ab21040ca98e7df256a5805aaa6a0eba8b9eab1ed39d26974fc25587d6dc5ec6762ac87112aa9af554641f614e5da8d8323172be5e995a0efbaac67ed9c98dfdaa79ca33dd78c6bd3ba3dddc03d9176b96bde21078a6f547d81383393c5be73a2b4a70c0990d34dd91429430984990df86045c0cc92a0b4d2080db5c4a2dfe43164351c419ffb05482d7a8c0fc170426970054f0d8e320f9af0dd7dd3a67a2f90ecadc31327159bf15b379bef01ef23da1fc69ee8b944ef82870a7222be179f18c6957c1ba2b44a0e00e5da83ba8fb4a7c8a389e02f8ff63aba84854e2e50fdc95d9c45a7a6b44b86dde4a97936e32a277374cd3eee970a1fdfc5cd0c91cace306d882d670d84a59325a246757e5669e5ac3172919b5b61a883be73e4b9c1d79e85594b2e3dcd14a1e40f05efa084d4abba3a70980a7fbb76e5151ad582ab239327af07fe1f7fb102d1ccc926f835caa3d63dccddec199c7f5f42383abffb9ed40839537ef4563757468c0db3ee6bce614929ea4bda98c417eeac0eb4dbfa1822a106f456ac4b27080f9e33b72b845c8d10ae4d7e711f5f6eb6847a6af0bc99fe2de971b6bfd13a3f239212ec893f8edaa8444a07578ab9fb427d7a73530a313a6ccaaa6da164dc2c41fdec0eb767a8fb4355b5cc4552951a3558d88ad89505509afbf6df81baa3b6db7ff5e834909a6f80e0bc84513c8fe396199fa843205682f781741440499751289592a73860429cc18539062d2b91f03afe18640b892b9193f1cf5c4b0109c7df89518c56d71a4a80dc1affa9f8c0b84c0735e069d68fca5a4ed9b2c8c9c2e4a1e3d10d3f593c149c60bae24ac10f2433ee94b96fa76b7dc4360a3785b6c84f4e21af684bb460513ef0575948acfeb2f49b5645c3284c893f53f3f632f398f8f2721c20bd3e0ff6f2193aa57f85722077bbc55164353d965592891186467a1fcb3f05833f6cc307a168cef2e08e1555adab383d19ccb8d33014ebbd4cbb1ff19d8779eecb1bfc617e03551d442f26c414e16601c71b649dfc8a4c6399adc2b669c88c8dbbe5836acee78f677f158d396743852b1df91827c606b8010b3b1d4f28042e03f83fccbb4323a347b1a8aa2cef3d69a4c968002f621f3ef84d0243dc4f7aca64b14ab4fb70b0a3776527bc834a2f4ad6bd15f37f373e556107bac46d79d548c60bf73c77478a6b051ea7f6f39548cb8a03865779b1a9467003febd83e09b209ba8877b044f1a14392074ed797cfc4d2b7fc0b4f14dd38a412a84ccd919fd375b0abf3252051d1cf0433fde01cf8570b7f0d1a30e724dbfdea133da6ff2f7aab50a930f476caccf6271d7e1e97c9e64d48a2b0b415d5f5aa42ce90c58143d34564ba180bd2aa76cd5f17b4aebe9d59510a0c46df4e82aea90fbb1bf712c2f98953055ff47b6f09ff8fd48efeaecd8440d7d63747a2662a3b4b9392f4c24ae49cb7f9382988916ce6b6a6995593b6c5f12c72bb6ee3b9178cfef49f3cdbcc6731fafabccf3249e58bd5ab3fde0a56bd12fe92df6ec1b377cf1f1dc6efffe6d134f5a7780720b3e6b126b69ab603990718a5a9e2dd7b141573268217ac22ae94fb634151d176bedd19871ae3cb9759d4ae08e3441d0b49158cdeca19c7de382fe194e45d6c73bdbb48237d09b024403898febd3be065d2e7c422152a2a3e5d6eb7f677c2df63e1188b6fc28c608e2ce69eb900c4d0c2698cf9d0bde5e7c18b60f3a2234b5d310a65ac098fa9f0b936e87dddfc62bde02ea5b84a038118edeb0cfafd4a8536d60434ff3cd20171b78cd92acaf557e6d8a3623cca95dccb2fb84fd4c6733daed910f04a4a7568e4ab7d3cd3921a9325f3471d405b9c2a96c4bba6a01172c42a8fb966cdc0c2311006427050c39317ada11e2c3cba8a9c56782c792dcba7ebb9dee5c3a9036cc44783a99c246c788cbf39ba1784146f9c0583bb9eeb1035861d2c21684589d4df70880070c0c162da9272d1cc5940c91b4cf124565a884d5e591614bcdcf1b4811b9730b8c6122d6846315da97178b7529dc31ef33fb5391f57637e3a45551e2a3c912b96e93b3bcf01894356b650db34594e3d1947b7c29c534de4473a26564567337ba71cfb39267598c30f79cee3cd461937a6216ffa73efc6830ce43081bad8057fa8bb73d627319eca678c5a3dac8b717aba32f0efda1dbfba8ce4ba131d9a2183e718b6d182e525fc37a67d9d09b87870116d24f434c132e046c5d759791926fadf2eb6c3d1a15dd92364c2c57323e5981a892c645f421b9842b8ad212d87347dc495346088adae0caa8b68b14a0c36af30554f0d1743208aa5b0dfb3743d1a9a29a0138c9846c3f4a65d7a93c24dea5cc51a4a7e458c0fc71ad21e8498b39851580f5fbac3fb499e93795909e5c5785d5989fe971b8bd4bac8cfc4f1a3f7007242add32542c6c82b69f07d82dd896c330564270d83f6440b6b843799ae08a4b9da4721c6ce18ec1c9a9ce6dc7dd4f5930076e25d48d8f971473fb017e3823536aa7a68feeedb372eefa3354827d0073b70d9fa7752e9f24104f6079c961485a77c084db59e1d252a84c19817977b52359f7492bf73dd1fa99aefc9ec015189d6c15a38daabd4010a1f0d9d2a5fc95bf1b56562423f89747150726798446413cf157238c2a6c04f041e49ed7579f8ab254cc3302e83ffaf8ed1ceab29c39400e48a2cb3334f752c7f11e9f7f21b8b8f16a71833aeb49f9e4be416e22718282acc7c5be0b29abfa95a16fcdf9c18df2fedd35c083a11f3a3b54d42b37b4c9f08c43e4fd37ecee985a5f7e5096a62a7d11d491e8c8d11d2dd0d412f696275e185a8230da5e87beea5b01f006ac43f249df595a92f53f21f8952a936d37b2fab287d323b217bfc05ab4e3f1e08cab35553fe41f838f26126d6636bb1c053a0e431b8fe94c604d4e83308f9ab27c0eef9184523f0375c90af4bc3de7a4ebd317ca02a7c6864e7b556774e752c336b2dca3dcbab7c7010a672223a5fe0d1acd78c20abbc8ba627914da0b90e0c34271fb921ae345179a2edc925cc5d05132216b4838f87232d04f151259e31f7aead8dd273b7b45e0f7c60f6bda5fcd34667b37b8e8f6530b5a4b34c56433d73bcbcffbf00ecda3371bfe75f10a46543d7bd98a41184b290a046eae6cfb8a8783bbe42a4710f153a3d063b855ee6973e25a09f822141256b4867dbf45b9f8268bad73b7d18dfcdb2f2c7aa547b94184f9df2491c9100175e6feb634393d13c6e54d754160ec0bf21ea3bf84900da219e2689c59e8da93f3a44ecfc4c16d05115bc47dd1b6689183d569edb713347a34c7fa1bf71180f9792f13c13ebeca3782938240aae6ce6206213d49d34612e4fc5aa7d6c2e0de7590256495d74e10413f8957ff639227279313ccd763338a6cf35e771f9bf9d8c97c7539e6910dfec3d620c0e27ac0db971ddcb6c0e17559ea25f72379ce1b3f85444681143cd3609e16eace08ccb6c9a0c419e324a07bb0207144487007729832028dc6fcb482b44a0ebfffdafbf49076d4889146da499d5a6d894f0702402cd462a972bd45d59eb3818e2c374a398d9e80eb068ebf8f89b0fdb206b3621ae1ba33c5183e923f50e9acc8217023716f5a0f1c670c04e6c020fc74a9bdcc2850a03717120dff8fdc2e0330ce400e975ea057d94c30ff814a2c5278ce9e79d960f4c11edf6d2caf8740941bf54f02a3648648fadd18928450d66e1e7b78fa7060f763b724b42007bd5e2bc2a156ccf0140098b87d0fd7c21c865be90e298e407a40a7fe34c35f00e16d71d6ae45649d5305f04d65d6c6643c0062d46cb5b88225bcc0472376ff0dcbb4f4e4d8bfc51ee5727982e1c600dc75ea35b98294e34254f119be0311e9da4217ccd144a76def07892716181e1bdf1a67c4f215f4e7c1b33ae16123393a3abe3edf22aefd9da85c2eb0aea04abfb5a79391511b5113e05c0019f73ad5efaf53fddf37c82b5da4219f26b5d9de5b57cb87caf3b3c9a24004595682782a8be814d37613ae65b748b023280a0cfc6eada41131d58533c9a1faea02daa0872c09c75b8deaca013a8412c4bef949a2d1104ae229557a7f6f722827b61d6ce6375e962b71abcff9debe8c3c972288abd67c639d186f52ae66e09197e7970a81a3750863020f4fd5e4561f1c548612738ce11a76d5b59a0220d1a8b53edaa14374b744ca333061b105404ad92180e254d43f3c8a0ba5c29e8b0097f9faa56b78f86bef00baa2806fb7082bc984840ae536bed85c69d69e6464c2f575a1c5665ab58489c3a8fb614f7a630fc9b718ec70f12dd21f514fcab2c68038760e4a94ff75f94c53e61b498d727ce1228fd3f6208f0874c24074fa2ac2122ac1110c11a05029c0a7f41ed112093e1b5e3fddd79fb9756125d9b9e0863460e89db052618056b8573a83ed75a0fb656c79d5aef50e6d95e90fa134d7f5b0433c6268f77308108b68f9a8238f110880f79605522ee13a6d620b3e2d8e72dce3e71922966b0060b37a7fa1c17d333b90845b56d42b30630eab219f8616acfd7155a0433746d0707f047ea6d8b264f07ba14a06832c6258cda633cd0d13cd1fa011be47ba3af6ec73f94419c178689b605bb8dd4edcbaeb9df35ecfdb524b3ab1059fae3b007fac7de8f7ca7bdbacfde6bd360a4e08ddd651e65ebf7dd47e05a234e6d9fc8814d13a1cd721e2e484b240843fa95ddb1380f95e025ebbebae5b303b02a4570ddcb5ba3c13b02625c9007741c67607104ed277a899b774ac4a0ff30355d546ae84d5eb335f8973fa2ac429b46cd5023480896005d5a29c027de7c3f460a483a83a3eabf6b0840087cea1a5fdbcbf6748cbfab55f1a9c83281c6211c437af4c067f638ed45869ff2b2a78fcf4c6dc5ac3f5765dd5a4203747910820269fbc4a72a3eed857443070da550b11213c49916591126ce62cae46638a02f30013e74433fa28df6b8fe88b484d6217fdec16f0a1a6c473376aaebdd25bc5a210eff401e57bd9725f34903a5073a8a71fa1f5a31149355ab81a7a6d9fd2b860fe5be491fe1fd379c7494a081e0bab02bafd0694f907f4863ae788b9d858fbd2fd5a875246942f6d4813cbe57cd7d4c829fd2a51ac926d07751abd61d2924ed05aa5e14e80a2f250732c38f3b50064c0811daf24f2fcf4195ccdda467e639163d1fb791cdfdbd31505bbbee95da5363a288d70b5ceb53c14c7dfbf8fc544702304efc14d0d15af117030f5f7eccac31d65107bf9bff138421d5c30f1c41a1d0281cb9d029d90688c3d8921a80f1ff533fa2965a912a2f695d2ece2b4b60e8770c4b210179264e8d0754bff27fae9d67d7670d705aa6aba2755969687e3a013118398dae43784d446b9ad8c9efcd5a63b7244e75ea2a19786a4f28263772e48e0aec60a39d8407801187a120bc1dad938d302e3bbcfe9549398c2bd1f6c3c8510810435788b84373590c32083555b760c0996f2274ea1ef32e2c36b18c37a8962c62444f7c67c0c2167264e903e34d608acf747017b481ccf2c252b7798d9e471a8339dba17a9a96dd1d0cdf5c8b3a71619f576c84c07d53e4b8e279b5546fde24f60bc645b5fb52925ae3d2e18053141b5def2c75bee41ec44920273b539d3e338ae696216af0828b1d841033e9d938d8b281f7ecf4df2789ac3cb6cc6206f72599d5ddabc027a023fcf9917154ca6fc2ffb6ce172dd2acae5fed737d30ab321faa29e1ade06cb2f88edb5429d8716fd53a7699388397beda81090733ab8219356b54b7797f91aeda1aaef0b94f0ede862f4dbee95b8daac8da19d05bea95f60fc213c33a1d59df57a6f398188f346122015b82734b1e4394411306da56702700e49ca68040e87c49dde1445697124510e120d3529c5b35fbc43ee5e898328f394b84f52cf6115395acc5125d556fff3b34d673e3f82b98e68eb091a6ba668d39a304b7798389daf588fe2f4a28dd2b40f734f2ad0d5a03fbcd6174345fce22392fd19f2cd4c62159e4be946798327bdbb3bbdbb06a0c7e2f02724580736b8936b3395c7864fced19e2306b9b59ac18a92d5456c45c584f600b13ff09f8c59d3e8faa7f29eab6e43817953328ee8121c39e01e8072a72e8c706bfa510b329273d9aa1219bc5e5a24cc5bea482c1b3d3d2d5fc7dc4fd0e360c4dfda13aa5a6f4219fe58f9c74e120337b172e70974c7c6deddb3a6cff706a9f25944860f3b9a0391b2d4907deecf3f74f0731a06850bd1d2a2a1ca5d6f7ddf44795cf5868963c1ee95ceaba7123bfaef21b4448479c3d0aed5c5e401584cfdb6fce9a0803b420265e06ab05a7cb5c24c72f5665204f1a5a6cd70fa73e33300b93f3ae54f31ed61f18f4afefb0d778316fc5ff6853fca5c2732d858c84c50379ea240bdb8ddd02360fd0d59efcf338ffc2b7e35189376c8b4cca684c2c59a766cc28b36c4b078639f97541e6e0125ec32b82318ceb53d12f6b7912db8bd6c50deecfb338883b1b136953df47c4fe6dda53d22a6a5b826f66fba5d51c70498e2bdb60e5d9bb28b629278e157a40c5bd151dc2ee80e51ba0c2d03a01e06b55201a43520c5863c0b5067f34e790465b28df5be05bbde734dc02d34733deacf1108640240aca469c722a5f21228a7c001e11e00d78e4c397b8a3be51f0e128589deff09c3dbee1a30512d8bdab45805f5730ee2ab25249581164fe9e9b00370eac582aba51c5440ee72430de62a6578afe0755def3dd25c62a4cbfe610c14672ae6d6a305a7c06470e1296c7a84e07e8c3a5e5de1d315e9248fcaf093f85943de3d6796561ad076000141964dfda699856aaea494036d6a62e9c1158568eb302d77abb9f4864bf0748218567b6f8897c3705f78259c8b16c6b0596f088800366bd2f22ffe957ee352d1bacabcc269f8c9f186a5ca677229f66d4c9d8c5403221a988305b3ec8cbbe1c0e85c322afee4e0bdeeca00ad4e2e15d6afd158b9659d73843cbd82501050b6d0ed9f758f047c43af1c0c461aa3df3382b10d5b52e0ec8b91eb78ee522561bc51816c5674ccea07b0c5ff59faf2853f32ce511c91b6a923f55bad8a5eef6e8112f722260bd8451d1479071ff8b833747d726807637142db1d67283e6c8cd88560b24a12d450f5e4639c031852ef98613e14c348b99ee20a8ae3374b77858289d18f77d3a6faa1cb73f981535b7b471dd8cd3ec7fad96afa882b99e79699f827a1deff7df7371e54e53f6b5e3b34c9fe3bb3d191bcd8d7e70a55b76c5c7dbf8443cc62b47059b3a81c2d8dbdf4eb232fab4c1bf5dff0393326b0f1ad09ce5ff1b32c5724863952e926c5b3efedb9bf4323615a9c18f41f0bc10118c209071f19c210631c2ee8625e687ad4cefaea67920621b37979bba948426b4b3cf002c7edf250ec83a705c201d6fd246cb293b689e908a4d5da6b7d08e0e9ef8e1db5d5743141be88f4a26feef78717d97fbe2abcc409602a5cc0842ebc974521270c4ace63bc65a3d412e8ffe0f226212944136b4df7ae5e40e467f5e4b776da06e67f3812c1eed539c8c28b71a72d15c37001f5a0194248246e95e01e34655a242f6bd4133902502a38bf2b1fc42b91ce191a0c4343054cd003f6e286fb79c6258a3ecab08102d70857c7d0926667e5f5d11afd8c731c5fdbc6c6ef7c3dd63f89faeb23d1b13333b277f059bb142c25f203eadb61359323fd49af9052253444b998bcba709fb7cc281f323b83c8ddf8491a27b894df59929b537dfcd50970de43122aef227d1094c956181a83ca42d9069e5d2e4e041fc8b7178880e7bf882541ecd59931b9d519e2886a927f7e31d84ad41931904b260312ca3e1415acfdb676322a42406c0e2da8988236a21589611da66c316164ffc31c474f804bcf0fc5fd9b4395500c100373c690dad73bf2d0b68182c99dfe9650a5728da15bf7f2dab52ad5097147ed604fbebe9a3305262213bab9a9757e62621a637d251245e549eafbfbab00c0b21e89eed4e1713a4410d2b6ac33581cba457954219a33c260a8ce3645350211e35981d4fa04e6972078e4d7c4eef30268639dc809b5daba8c47b0fb9edd505ee73567a586edc1af7dad20abc3387ce4f7c801999f4523cb8fb921902f8173e252b1863b50f7a6fb4355ee833be5da74f6bffeae29e5af42c064c61db251919aa723e184a103a7eec415e8e2805550cc93fe0e51d67efdddebd6f7c66abea1f05b00404f571f48ac63a24d3b0acb468bf18bad643e411fb42a8d28d9e8c9a27b93dde916bec0bb70acef65a359cfb589fc605dc4c585709121919f1cae708348027a553826791a2e0e96bbc020781ad0257796865fd837e52dca03f5c50930088ce3d1459f01d1a4d5960fa9ed3df1bad7c773bd5fef6049329446c64e7b70f83c43010464e18aaf47fffba4ca12272f4089137ce54732554d8f3900ee3023c07a85f1f56ea4cb75dbd9d693ec6bc4625bbd29bf64bb7619cfbbb07b165c93f80b090ce500192eb1ae170972edde1be6c85e28a4f7f3898069025229d88950725909f7926d12045222225e1ae9c3cd06d091ce6ce2c843f790caadf5b16220b4c5809d0886b55aaf0b90c5e2bc2aa1aa759b6c7650af6280a06f4eb8a7986034748db3baaf5b3ffe043eb8188ac8ec8f630862d1141cae2fc58d70b4241de3b1d951f6cca3472e23858cffd923e37ca89a2f0f7e30298b008fcb0e2d2a6cc33caaa2082fabae2a323b353130dfd9bfc234cf7010c7519b32a33244d0f632f1315fbcf770c4f3976b3cdeacebd1599652d76785ee8bb2e23bd441f2a49cbff377a2fe6dee9aac20e5e55ca3ac022a5c40faa15f5fed076bc88cd35a1eb5414107b276dab78d7059e26f1fb1c95b59bc855c5d642ddcff6853a33c841ef43f73f1643fa15186666b7d5fbb6bd4ed59df3ed0c2a896316cb4a491722763f62280bf2e5539b734d70303b047ba2aab7dd02f1ec68a84d2fa90ad588bf31fd981a3d100a8d97c3d42d5b2a33e58ca9371e229a81bc6aa958d8c482e9ae08e5829405e2652225a077b2bbbeccc4cfe85ef7b3d41f3f88189838aa82a170731135ea1009b7abd751e24881e8774b535fb054210dff0f01a73a5a21bcb907873b073a2d84258c136ddf37735df5252333d1512fa3208eac2e33795898334ad47818f8074fbe8b99b2d6d90810f9f1ee610a083d59bcdd79d52b7e8d70421dcf7842811c00fc9f43fd906e51e5cc6fe9aa85ae44487cc840f9edf9f6b28041f187b0780927e39f63f73ffcc50a512d111f36d5c0696e885ac1fa331f54f7a990e20db314593b61e03f57e7da2cd6d098bcafa6afb4efe281c5d4069300ad89268ce3fb10ab03bad5d0fc33ee56014f8df7902400d6f3a998d6d3e3ead6e7de8ba313ad125db6825d564c7f00491cd705bdf01fd7ab064bd219b80febd4bfea48dd3adc126dfe78be6a593bfe9ffd1ec3a3d0d88bdaad7ff976d8dbd0358cb3927ee44305a7033ef9ea066973b34b6738aba0c457fbc8e99ce31a9cfcff26f099b34f2e380c7d353adcb1e416a39f6bbeccd28c3e7dc8a7f1c94100f69aa5c92f66265813daaf33be5bfa42f14d4c0296f92c38790eb16dda5b2cd73b8a744d2843a5a63994f28b6d8ce0b9f3ce2c40432a665976f2691a7e6c9e20972d916011b4b7a528edb0272dd6e6550227ff94fa390d8fabc25161ff56f4c088315371b5146ff502e5be2178d499579e01c2ce44358ee169d3247b86d53a57c81d939efa25ca9b1259f974e503b06481e14fefe7013fef222e1348173d9fd55a24012c9d5d6610226c8169d53b0d93e30e21d03691a6901cf695b19739f124a81e3d559f2d8cb50d2df7d31c7fa5a6c1d06314d6807623192d53c3a112a7f7ef4bad5103e91243371ae2adf0f6c7f228201fec78a4a85ed2750ec96daf63a8f8a9df69e68d986013dac0c5aa42e5491064e0a535f7f7e49b514c2fd6d00c22324c4c748c1f62d406076fabe61b68972be3486868d5aca678239caa8a735ccdc388e46c19f27ea5198f0401b46bca86b42f90d0cc6be5a0b8035d3e4b6d61c26577b6bf8816bc4d2af8be2d8e1509c014ac055a9e1db0baca19ba05af3d29401da23c357ed5ad53017456c6953b4ec450a3a09d4d66f87652234785dd19d3635541fb51460602683ea765405472026aa4899771ef8b767d58bf728b866bcae48e94b8e6852ac3141bb3779ce71b565edf3b976442bdf8e7107abe859528d9bd2f37080b92f0ae27052b556345222373406972f4aab921c059ed81217b80fe3a50570a750e1d36b004f56e3076913df5cc1b05c7a409f290badaf280e8d0a9705e2c5e4f2050309f00bcfff82d7aa88158fbf96f840265d974d22076e97effb9334f6cb1d399d7959ecf0331bf2d2ecb7411221e97a59c4487d1dbeb2e07513ce5b30676f3e17b7139df1ccc61c87278fe74b304650f493929353f856124ae3493bd638a809717801a47fa2142a66eadc8ba74f90333df220570d9709b582360e69a0ac29bf3283c0ba1ec60186477e28657af159198e97efc5c59584ad909d70b303cccc98170a8299b3a671d6cce17e035cd9ed2da3fd90b04ea8bb0b08b651afe630b87b1c0a5361c0d3ecb721a8540b322e584eb04aa1a79a72bec68945855ab5b98dd3ec66c0484f0f366cc3fadf450dfa4a3982a02d8e54370e0dcec6921419eacb988aac6008eeda5b3da78590a15a55949c7bac569ab455955527d3f475489fa8b8a77b826f6bd62385d75dc267867bfd33e25468f2640539eecdf3df798e54a9ae656c61f9eaef031ff5e494541c38faf6973928c0e4afd40fb6382eec61cc1536c1c2295d1921110cffef583d65f323f8dd5072a7d3060f47dd4428a39472587edbc443f3d16dec3689e7936a5d67d28aa643da5e1749cf78ce249448f2af160e378a486110920385e1f23ac6253e5bcafe4bae58bed19d2cf8eab417f1e44e9294ce50633c2151a11e8e21a3d863471d0c09b761a0a99ce6e6c955c849bfe870833008e337b0a0e5cea8f35fb254e8483287b02b59bb19bf7cbce46ea0964755767e821ccfab0a55468b59ac8ec4811e38599ed5be11f6fbf3e98dc332094d0de85288adfbfb91bb5d5047d788496874e05bca6c759debe65410d66319c2ea78eb2ce0b3332e71f4e445e50ee6066a6e0dae2b83fb8ccd595ef2bb38cd3a9caa0b656a5332a2a0bac9862c4ce5af96b06d053f77c11eabfa699e7e394a17a90aa4857b8398dd9f5bd4e82537d32e4cf5063142e129eaf05f62c5f3f02c7004a151112b628fd215ade3bb9d37e01bf4c07a22159caa0a7f17f48318dbaa85a08b19944386bf12e61fe75f4060db38513c8a1ad35e8d5aaf36d2425e44aea339fe670e90d0765656389c13751da4fad8618cc6b3bff7a25c96f157a09261f784b06b40995239d1449619b3a1e7097edc771116d0e815e866aeeec19a0a0d72c4cfe261e0cae3fb33200ccd564227394dac1211cedf47b618f625fc35b50f608b12bf5c00014e8618d60342ff791e7a1b1d90b66a61a83be21a6bdcc62195ba0d260ddf9942f3b1fc5e5c6d75a1bcee91737aa34d649ffbdd5814acbcdfbf6bef72b4657a755c9dfda3ea51031c66834c47e981bbff4a733c26befac02d16af4bf9b9e162a0b1ebc8b991604fdea38f437feb8ed7f45cce7039e14058bd4b7e887dd81d20ffa726afa9c650d9eea838a5054a3a4027f0579914b1e55ab7ca0741ba36c202f000000009375efe3ffc03f7a2f5b891a08e61a37c759c36781c908ee93b9bfab3600e71865b097b7e90695d8a9922a80062e93869b7ec9a02ad13e69852060d1ce098f27ebbac326c2c96d3074faa2fec849435a147817ab9843353636c7cacf59f9281c6ae6b84a772b71b4ee321f2ffa62f130a26541e69d21a1a50c980a4c728a2d320000000000000000007747e5a62c4fa5c934e802d36882478592d959745642a9c6ef996d83fbd1fa3c42c2ab2859039181b018ede264a22dcb235443affb4b97104aa30729a9a7c81e00",