Merge remote-tracking branch 'QED-it/zsa-integration-block-test' into zsa-issued-assets-tests

This commit is contained in:
Arya 2024-11-15 17:57:43 -05:00
commit e040ae0ee1
30 changed files with 851 additions and 259 deletions

View File

@ -125,7 +125,7 @@ impl Commitment {
// NetworkUpgrade::current() returns the latest network upgrade that's activated at the provided height, so
// on Regtest for heights above height 0, it could return NU6, and it's possible for the current network upgrade
// to be NU6 (or Canopy, or any network upgrade above Heartwood) at the Heartwood activation height.
(Canopy | Nu5 | Nu6, activation_height)
(Canopy | Nu5 | Nu6 | Nu7, activation_height)
if height == activation_height
&& Some(height) == Heartwood.activation_height(network) =>
{
@ -136,7 +136,7 @@ impl Commitment {
}
}
(Heartwood | Canopy, _) => Ok(ChainHistoryRoot(ChainHistoryMmrRootHash(bytes))),
(Nu5 | Nu6, _) => Ok(ChainHistoryBlockTxAuthCommitment(
(Nu5 | Nu6 | Nu7, _) => Ok(ChainHistoryBlockTxAuthCommitment(
ChainHistoryBlockTxAuthCommitmentHash(bytes),
)),
}

View File

@ -102,7 +102,7 @@ impl NonEmptyHistoryTree {
)?;
InnerHistoryTree::PreOrchard(tree)
}
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => {
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => {
let tree = Tree::<OrchardOnward>::new_from_cache(
network,
network_upgrade,
@ -156,7 +156,7 @@ impl NonEmptyHistoryTree {
)?;
(InnerHistoryTree::PreOrchard(tree), entry)
}
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => {
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => {
let (tree, entry) = Tree::<OrchardOnward>::new_from_block(
network,
block,

View File

@ -313,6 +313,9 @@ bitflags! {
const ENABLE_SPENDS = 0b00000001;
/// Enable creating new non-zero valued Orchard notes.
const ENABLE_OUTPUTS = 0b00000010;
/// Enable ZSA transaction (otherwise all notes within actions must use native asset).
// FIXME: Should we use this flag explicitly anywhere in Zebra?
const ENABLE_ZSA = 0b00000100;
}
}

View File

@ -4,7 +4,8 @@
#[cfg(any(test, feature = "proptest-impl"))]
pub(crate) mod arbitrary;
mod common;
#[cfg(test)]
mod tests;
mod asset_state;
mod burn;

View File

@ -4,12 +4,28 @@ use std::io;
use crate::{
block::MAX_BLOCK_BYTES,
serialization::{SerializationError, TrustedPreallocate, ZcashDeserialize, ZcashSerialize},
serialization::{
ReadZcashExt, SerializationError, TrustedPreallocate, ZcashDeserialize, ZcashSerialize,
},
};
use orchard::{note::AssetBase, value::NoteValue};
use super::common::ASSET_BASE_SIZE;
// The size of the serialized AssetBase in bytes (used for TrustedPreallocate impls)
pub(super) const ASSET_BASE_SIZE: u64 = 32;
impl ZcashSerialize for AssetBase {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(&self.to_bytes())
}
}
impl ZcashDeserialize for AssetBase {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
Option::from(AssetBase::from_bytes(&reader.read_32_bytes()?))
.ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa AssetBase!"))
}
}
// Sizes of the serialized values for types in bytes (used for TrustedPreallocate impls)
const AMOUNT_SIZE: u64 = 8;

View File

@ -1,23 +0,0 @@
//! Serialization implementation for selected types from the 'orchard_zsa' crate used in this module.
use std::io;
use crate::serialization::{ReadZcashExt, SerializationError, ZcashDeserialize, ZcashSerialize};
use orchard::note::AssetBase;
// The size of the serialized AssetBase in bytes (used for TrustedPreallocate impls)
pub(super) const ASSET_BASE_SIZE: u64 = 32;
impl ZcashSerialize for AssetBase {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(&self.to_bytes())
}
}
impl ZcashDeserialize for AssetBase {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
Option::from(AssetBase::from_bytes(&reader.read_32_bytes()?))
.ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa AssetBase!"))
}
}

View File

@ -2,42 +2,38 @@
use std::{fmt::Debug, io};
use nonempty::NonEmpty;
// FIXME: needed for "as_bool" only - consider to implement as_bool locally
use bitvec::macros::internal::funty::Fundamental;
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
use halo2::pasta::pallas;
// For pallas::Base::from_repr only
use group::ff::PrimeField;
use zcash_primitives::transaction::components::issuance::{read_v6_bundle, write_v6_bundle};
use orchard::{
issuance::{IssueAction, IssueBundle, Signed},
keys::IssuanceValidatingKey,
note::{ExtractedNoteCommitment, RandomSeed, Rho},
primitives::redpallas::{SigType, Signature, SpendAuth},
value::NoteValue,
Address, Note,
note::ExtractedNoteCommitment,
Note,
};
use crate::{
block::MAX_BLOCK_BYTES,
serialization::{
zcash_serialize_bytes, zcash_serialize_empty_list, ReadZcashExt, SerializationError,
TrustedPreallocate, ZcashDeserialize, ZcashDeserializeInto, ZcashSerialize,
},
serialization::{SerializationError, TrustedPreallocate, ZcashDeserialize, ZcashSerialize},
};
use super::common::ASSET_BASE_SIZE;
use super::burn::ASSET_BASE_SIZE;
/// Wrapper for `IssueBundle` used in the context of Transaction V6. This allows the implementation of
/// a Serde serializer for unit tests within this crate.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct IssueData(IssueBundle<Signed>);
impl IssueData {
/// Returns a reference to the inner `IssueBundle<Signed>`.
pub fn inner(&self) -> &IssueBundle<Signed> {
&self.0
}
}
impl From<IssueBundle<Signed>> for IssueData {
fn from(inner: IssueBundle<Signed>) -> Self {
Self(inner)
@ -75,126 +71,6 @@ const RANDOM_SEED_SIZE: u64 = 32;
const NOTE_SIZE: u64 =
ADDRESS_SIZE + NOTE_VALUE_SIZE + ASSET_BASE_SIZE + NULLIFIER_SIZE + RANDOM_SEED_SIZE;
// FIXME: duplicates ZcashSerialize for reddsa::Signature in transaction/serialize.rs
// (as Signature from oechard_zsa is formally a different type)
impl<T: SigType> ZcashSerialize for Signature<T> {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(&<[u8; 64]>::from(self))?;
Ok(())
}
}
// FIXME: duplicates ZcashDeserialize for reddsa::Signature in transaction/serialize.rs
// (as Signature from oechard_zsa is formally a different type)
impl<T: SigType> ZcashDeserialize for Signature<T> {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
Ok(reader.read_64_bytes()?.into())
}
}
impl ZcashDeserialize for Signed {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
let signature = Signature::<SpendAuth>::zcash_deserialize(&mut reader)?;
Ok(Signed::from_data((&signature).into()))
}
}
impl ZcashSerialize for IssuanceValidatingKey {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(&self.to_bytes())
}
}
impl ZcashDeserialize for IssuanceValidatingKey {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
IssuanceValidatingKey::from_bytes(&reader.read_32_bytes()?)
.ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa IssuanceValidatingKey!"))
}
}
impl ZcashSerialize for Address {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(&self.to_raw_address_bytes())
}
}
impl ZcashDeserialize for Address {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
let mut bytes = [0u8; ADDRESS_SIZE as usize];
reader.read_exact(&mut bytes)?;
Option::from(Address::from_raw_address_bytes(&bytes))
.ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa Address!"))
}
}
impl ZcashSerialize for Rho {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(&self.to_bytes())
}
}
impl ZcashDeserialize for Rho {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
Option::from(Rho::from_bytes(&reader.read_32_bytes()?))
.ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa Rho!"))
}
}
impl ZcashSerialize for RandomSeed {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(self.as_bytes())
}
}
// RandomSeed::zcash_deserialize can't be implemented and used as it requires Nullifier parameter.
// That's why we need to have this function.
fn zcash_deserialize_random_seed<R: io::Read>(
mut reader: R,
rho: &Rho,
) -> Result<RandomSeed, SerializationError> {
Option::from(RandomSeed::from_bytes(reader.read_32_bytes()?, rho))
.ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa RandomSeed!"))
}
impl ZcashSerialize for NoteValue {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
// FIXME: use Amount serializer/deserializer?
writer.write_u64::<LittleEndian>(self.inner())?;
Ok(())
}
}
impl ZcashDeserialize for NoteValue {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
Ok(NoteValue::from_raw(reader.read_u64::<LittleEndian>()?))
}
}
impl ZcashSerialize for Note {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
self.recipient().zcash_serialize(&mut writer)?;
self.value().zcash_serialize(&mut writer)?;
self.asset().zcash_serialize(&mut writer)?;
self.rho().zcash_serialize(&mut writer)?;
self.rseed().zcash_serialize(&mut writer)?;
Ok(())
}
}
impl ZcashDeserialize for Note {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
let recipient = (&mut reader).zcash_deserialize_into()?;
let value = (&mut reader).zcash_deserialize_into()?;
let asset = (&mut reader).zcash_deserialize_into()?;
let rho = (&mut reader).zcash_deserialize_into()?;
let rseed = zcash_deserialize_random_seed(&mut reader, &rho)?;
Option::from(Note::from_parts(recipient, value, asset, rho, rseed))
.ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa Note components!"))
}
}
impl TrustedPreallocate for Note {
fn max_allocation() -> u64 {
// FIXME: is this a correct calculation way?
@ -204,24 +80,6 @@ impl TrustedPreallocate for Note {
}
}
impl ZcashSerialize for IssueAction {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_u8(self.is_finalized().as_u8())?;
self.notes().to_vec().zcash_serialize(&mut writer)?;
zcash_serialize_bytes(&self.asset_desc().to_vec(), &mut writer)?;
Ok(())
}
}
impl ZcashDeserialize for IssueAction {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
let finalize = reader.read_u8()?.as_bool();
let notes = (&mut reader).zcash_deserialize_into()?;
let asset_descr = (&mut reader).zcash_deserialize_into()?;
Ok(IssueAction::from_parts(asset_descr, notes, finalize))
}
}
impl TrustedPreallocate for IssueAction {
fn max_allocation() -> u64 {
// FIXME: impl correct calculation
@ -229,56 +87,17 @@ impl TrustedPreallocate for IssueAction {
}
}
impl ZcashSerialize for IssueBundle<Signed> {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
// FIXME: try to avoid transforming to Vec (consider implementation of ZcashSerialize for IntoIter generic,
// or use AtLeastOne).
// This is how does it work in librustzcash:
// Vector::write_nonempty(&mut writer, bundle.actions(), |w, action| write_action(action, w))?;
let actions: Vec<_> = self.actions().clone().into();
actions.zcash_serialize(&mut writer)?;
self.ik().zcash_serialize(&mut writer)?;
writer.write_all(&<[u8; 64]>::from(self.authorization().signature()))?;
Ok(())
}
}
impl ZcashSerialize for Option<IssueData> {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
match self {
None => {
// Denoted as `&Option<IssueData>` in the spec (ZIP 230).
zcash_serialize_empty_list(writer)?;
}
Some(issue_data) => {
issue_data.0.zcash_serialize(&mut writer)?;
}
}
Ok(())
fn zcash_serialize<W: io::Write>(&self, writer: W) -> Result<(), io::Error> {
write_v6_bundle(self.as_ref().map(|issue_data| &issue_data.0), writer)
}
}
// FIXME: We can't split IssueData out of Option<IssueData> deserialization,
// because the counts are read along with the arrays.
impl ZcashDeserialize for Option<IssueData> {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
let actions: Vec<_> = (&mut reader).zcash_deserialize_into()?;
if actions.is_empty() {
Ok(None)
} else {
let ik = (&mut reader).zcash_deserialize_into()?;
let authorization = (&mut reader).zcash_deserialize_into()?;
Ok(Some(IssueData(IssueBundle::from_parts(
ik,
NonEmpty::from_vec(actions).ok_or_else(|| {
SerializationError::Parse("Invalid orchard_zsa IssueData - no actions!")
})?,
authorization,
))))
}
fn zcash_deserialize<R: io::Read>(reader: R) -> Result<Self, SerializationError> {
Ok(read_v6_bundle(reader)?.map(IssueData))
}
}

View File

@ -0,0 +1,2 @@
mod issuance;
mod vectors;

View File

@ -0,0 +1,25 @@
use crate::{block::Block, serialization::ZcashDeserialize, transaction::Transaction};
use super::vectors::BLOCKS;
#[test]
fn issuance_block() {
let issuance_block =
Block::zcash_deserialize(BLOCKS[0].as_ref()).expect("issuance block should deserialize");
for transaction in issuance_block.transactions {
if let Transaction::V6 {
orchard_zsa_issue_data,
..
} = transaction.as_ref()
{
let issue_bundle = orchard_zsa_issue_data
.as_ref()
.expect("V6 transaction in the issuance test block has orchard_zsa_issue_data")
.inner();
assert_eq!(issue_bundle.actions().len(), 1);
assert_eq!(issue_bundle.actions()[0].notes().len(), 1);
}
}
}

View File

@ -0,0 +1,3 @@
mod blocks;
pub(crate) use blocks::BLOCKS;

View File

@ -0,0 +1,703 @@
pub(crate) const BLOCKS: [&[u8]; 1] = [&[
0x04, 0x00, 0x00, 0x00, 0x27, 0xe3, 0x01, 0x34, 0xd6, 0x20, 0xe9, 0xfe, 0x61, 0xf7, 0x19, 0x93,
0xb2, 0xc2, 0x72, 0x75, 0x6a, 0xce, 0xec, 0xdc, 0xbf, 0xd3, 0xe5, 0x43, 0xf7, 0x30, 0xbc, 0x65,
0x83, 0x20, 0xba, 0xb6, 0x3e, 0x7e, 0x72, 0xc9, 0x1b, 0x5e, 0x23, 0x02, 0x56, 0x76, 0xf9, 0x0e,
0xd8, 0x11, 0x9f, 0x02, 0x77, 0x8a, 0xa0, 0x8d, 0x1a, 0x56, 0x79, 0x47, 0x66, 0x88, 0xbf, 0x6e,
0x8e, 0x5a, 0x4f, 0x57, 0x00, 0x23, 0xde, 0x3e, 0xf1, 0x3a, 0x05, 0xe5, 0x9d, 0x2e, 0x94, 0x76,
0x6a, 0x3c, 0x7a, 0x94, 0x88, 0x5d, 0x72, 0x57, 0x04, 0x56, 0x3c, 0x74, 0xd1, 0x7a, 0xbd, 0xf7,
0x53, 0x53, 0xdb, 0x1a, 0xf2, 0xfa, 0x49, 0x4d, 0x3f, 0xa6, 0x0c, 0x20, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xfd, 0x40, 0x05, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
0x04, 0x00, 0x00, 0x80, 0x85, 0x20, 0x2f, 0x89, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x02, 0x51, 0x00,
0xff, 0xff, 0xff, 0xff, 0x01, 0x40, 0xbe, 0x40, 0x25, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9,
0x14, 0x75, 0xdd, 0x6d, 0x7f, 0x4b, 0xef, 0x95, 0xaa, 0x1f, 0xf1, 0xa7, 0x11, 0xe5, 0xbf, 0xd8,
0x53, 0xb4, 0xc6, 0xaa, 0xf8, 0x88, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x80, 0xf8, 0x69,
0x4a, 0x12, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1d, 0x1c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x64, 0x40, 0xa8, 0x86, 0x5d, 0x61, 0x39, 0xb3, 0x39, 0x62, 0x94, 0xee, 0x42,
0xc5, 0xa6, 0x0b, 0x63, 0x57, 0xca, 0x65, 0x8b, 0xa6, 0x76, 0xf2, 0xd6, 0xda, 0x8e, 0x00, 0xcf,
0x60, 0xe8, 0x33, 0xa4, 0x55, 0xec, 0x7c, 0x99, 0x0f, 0xda, 0xd2, 0x46, 0xc0, 0x5b, 0x4a, 0x8f,
0xe5, 0x2c, 0x6a, 0xb7, 0x00, 0xca, 0x49, 0xb4, 0xda, 0x80, 0xd3, 0x3d, 0x4d, 0x83, 0x7a, 0xd1,
0x3a, 0x21, 0x3f, 0xfe, 0x71, 0xf5, 0x04, 0xd3, 0xaf, 0xeb, 0x10, 0x9d, 0xc2, 0x0d, 0xbd, 0x3a,
0x9b, 0x2d, 0xf7, 0x7c, 0xd3, 0x2c, 0x7e, 0x7b, 0xeb, 0xb7, 0xaf, 0x60, 0xe4, 0xd3, 0x41, 0x96,
0xe7, 0x2c, 0x0a, 0xf8, 0x99, 0x89, 0xbd, 0x70, 0x79, 0x54, 0x3b, 0xc7, 0x66, 0x29, 0x91, 0x31,
0x97, 0xa6, 0x53, 0xfe, 0x24, 0x70, 0xf9, 0xf2, 0x41, 0x81, 0xac, 0x79, 0x60, 0x43, 0x79, 0xed,
0x42, 0xba, 0x25, 0xdd, 0xf0, 0x05, 0xe8, 0xff, 0x14, 0x9e, 0xe8, 0x34, 0x91, 0x5d, 0xc6, 0x9d,
0x6a, 0x2f, 0xc5, 0x70, 0x55, 0x65, 0x01, 0xf3, 0x74, 0x6f, 0xe7, 0x37, 0x4a, 0x8f, 0x5d, 0x4d,
0xb6, 0x4e, 0x3b, 0xab, 0xc5, 0xc9, 0xa2, 0x86, 0x28, 0x0e, 0xa6, 0x2d, 0xc0, 0xc4, 0x12, 0x74,
0xe9, 0x39, 0x34, 0xa6, 0xd8, 0xbc, 0x24, 0xdf, 0x5a, 0x2b, 0x2d, 0xd3, 0xae, 0x62, 0x2f, 0x37,
0x38, 0xcb, 0x41, 0x26, 0xa5, 0xae, 0xed, 0x94, 0x84, 0x51, 0xc2, 0xe7, 0xff, 0xbe, 0x27, 0x7b,
0x37, 0x94, 0xc0, 0xb5, 0x17, 0x08, 0x0a, 0x00, 0xd4, 0x69, 0x74, 0x8f, 0x4e, 0x2c, 0xeb, 0x06,
0x2f, 0x1d, 0x61, 0xdc, 0x70, 0xab, 0x97, 0xc9, 0xbd, 0x02, 0x68, 0xf0, 0xe1, 0x5e, 0xcb, 0x76,
0x25, 0x2c, 0x2c, 0xd2, 0xf1, 0x8a, 0x03, 0xb3, 0x2f, 0x0b, 0x40, 0xa2, 0x56, 0xc4, 0x3a, 0xd0,
0xf7, 0xc4, 0xef, 0x98, 0x52, 0x87, 0x54, 0x5b, 0x8e, 0xf8, 0xb3, 0x6e, 0x3d, 0x9e, 0xd6, 0x05,
0xb9, 0x49, 0x54, 0x1b, 0xe0, 0xbc, 0xe7, 0x52, 0x71, 0x6c, 0x70, 0xdb, 0x0c, 0xf2, 0x06, 0x9e,
0x80, 0x90, 0xde, 0x83, 0x0e, 0x8c, 0xee, 0xa3, 0x36, 0x99, 0xf0, 0xa8, 0x29, 0x58, 0x9e, 0xa8,
0x4c, 0x90, 0x0d, 0x66, 0x06, 0xf9, 0x95, 0x21, 0x65, 0xa4, 0x90, 0x58, 0x9f, 0x61, 0x66, 0x25,
0x8b, 0x7b, 0x13, 0xa1, 0x6b, 0x9c, 0xf4, 0x80, 0xfb, 0x34, 0xd1, 0x0f, 0x52, 0x2d, 0xbd, 0x2a,
0xcd, 0x16, 0x7b, 0x7d, 0xd0, 0x6c, 0x4d, 0x2d, 0xbb, 0x51, 0x90, 0x7d, 0x4d, 0x38, 0xbe, 0x06,
0x95, 0x18, 0xd4, 0x31, 0x6d, 0xa4, 0x67, 0xca, 0xe5, 0x35, 0x51, 0xaa, 0xb4, 0x33, 0x46, 0x67,
0xc0, 0xa5, 0xb7, 0x07, 0x63, 0x64, 0xe8, 0x42, 0x8e, 0x81, 0xf4, 0xc4, 0xcb, 0xde, 0x44, 0xe8,
0xf1, 0x80, 0xca, 0x7a, 0x70, 0x33, 0x64, 0xaa, 0x4d, 0x50, 0xaf, 0xf3, 0x24, 0x27, 0xc4, 0x23,
0xfb, 0xf8, 0x47, 0x61, 0x83, 0x5c, 0x31, 0xeb, 0x69, 0x73, 0x64, 0x4c, 0xe3, 0x8e, 0x24, 0x40,
0xd9, 0xe0, 0x46, 0x17, 0xbc, 0x0b, 0xa0, 0xcd, 0x8d, 0x14, 0x96, 0x57, 0x21, 0x71, 0x97, 0x9c,
0xa7, 0x5b, 0x28, 0xb7, 0x5b, 0x71, 0xd2, 0x7b, 0x77, 0x83, 0x09, 0x3a, 0xc4, 0x9c, 0x37, 0x38,
0xfb, 0xdf, 0xe1, 0xf9, 0xc7, 0x29, 0xe0, 0x50, 0xbb, 0xfd, 0x7b, 0xa1, 0x53, 0xe5, 0x3b, 0x85,
0x61, 0x21, 0x66, 0xf0, 0xa2, 0xb7, 0x65, 0x77, 0xd4, 0x5f, 0x0f, 0xf8, 0x5f, 0x4c, 0x6a, 0x90,
0x03, 0xc1, 0x2f, 0x8c, 0x95, 0xa4, 0x36, 0x88, 0x51, 0x43, 0xd9, 0xa8, 0x78, 0x7f, 0x36, 0xb2,
0x27, 0x2f, 0x2c, 0xd0, 0x21, 0xdc, 0x6a, 0x3f, 0x34, 0xdf, 0xac, 0x94, 0xf2, 0x8f, 0x13, 0x2e,
0x3d, 0x2a, 0x4a, 0xf0, 0xdc, 0xa4, 0x1c, 0xc8, 0x59, 0x7e, 0xa0, 0x88, 0x7c, 0x02, 0x06, 0xf1,
0xbe, 0x5a, 0xae, 0xc4, 0xf7, 0x72, 0x46, 0x97, 0xd9, 0x4b, 0x47, 0x9f, 0x9b, 0x93, 0x93, 0x71,
0x8d, 0x80, 0xf7, 0xaf, 0xc7, 0xf9, 0xc9, 0x84, 0xd5, 0x9e, 0x87, 0x0f, 0x64, 0x33, 0x1f, 0xd6,
0xf5, 0x90, 0x2d, 0x3a, 0xc3, 0x59, 0xf5, 0x25, 0xe6, 0xa5, 0xda, 0xf4, 0x21, 0x24, 0x9d, 0xdb,
0x69, 0x86, 0x93, 0xec, 0x7d, 0x9b, 0xfd, 0x71, 0x19, 0xab, 0x05, 0xb6, 0xfd, 0x5c, 0x6b, 0x17,
0x7e, 0xe5, 0xc4, 0x10, 0x38, 0xd7, 0x9b, 0x84, 0x94, 0x0d, 0xf1, 0xf5, 0xe6, 0x79, 0x84, 0x3c,
0x04, 0x84, 0x2c, 0x6a, 0x62, 0xcf, 0xd6, 0x2f, 0xd0, 0x1b, 0xcc, 0xc2, 0xc8, 0x2a, 0x67, 0x34,
0x52, 0xae, 0x88, 0x48, 0x47, 0x5f, 0x61, 0x4d, 0xba, 0x6c, 0x53, 0xf1, 0x8b, 0x12, 0x54, 0xcc,
0xf0, 0x77, 0x89, 0x72, 0x98, 0x97, 0xed, 0x2e, 0xfa, 0xef, 0x0b, 0x54, 0x69, 0x02, 0x69, 0x15,
0xa6, 0x5f, 0x11, 0xed, 0x04, 0x58, 0x02, 0x46, 0xc4, 0xdc, 0x9c, 0xb6, 0xe1, 0xc8, 0xd8, 0xdc,
0xa3, 0x99, 0xea, 0x17, 0x96, 0x74, 0x7b, 0x5f, 0xeb, 0x00, 0x02, 0x91, 0x04, 0x9e, 0xf4, 0xff,
0x6d, 0x0b, 0x29, 0x82, 0x37, 0x1a, 0x4c, 0xa0, 0x71, 0x71, 0x20, 0xaf, 0xe4, 0x3b, 0x6e, 0x26,
0xb1, 0x89, 0x56, 0xb3, 0xb6, 0x44, 0x2d, 0x2b, 0xb4, 0x6f, 0x22, 0xe4, 0x5d, 0xd8, 0x7d, 0x25,
0x60, 0xe7, 0xf4, 0xab, 0x87, 0x0b, 0x97, 0x0a, 0xd4, 0x82, 0x48, 0x93, 0x0f, 0x1d, 0xcc, 0xc7,
0x69, 0xee, 0xc7, 0xcf, 0x5d, 0x9b, 0xbe, 0x9f, 0x23, 0x4b, 0x06, 0x49, 0x88, 0xf5, 0xbd, 0xb5,
0xc3, 0xed, 0x46, 0x2a, 0x17, 0xc8, 0x5c, 0x4e, 0xa4, 0x56, 0xf3, 0x62, 0x28, 0xe7, 0xd1, 0x66,
0x15, 0x1c, 0xeb, 0x62, 0xc1, 0x64, 0xee, 0xb6, 0x98, 0x7a, 0x9e, 0x40, 0xaa, 0xa2, 0x7d, 0xca,
0xb6, 0xf3, 0x82, 0x6d, 0x65, 0xfb, 0x82, 0x57, 0xd2, 0x64, 0xc8, 0xb8, 0x15, 0x1b, 0x68, 0x94,
0x90, 0x7a, 0xd5, 0xd7, 0xe6, 0x42, 0x99, 0x6f, 0x46, 0xc8, 0x3d, 0x9e, 0x5d, 0x85, 0x00, 0x7b,
0xed, 0x53, 0xde, 0x27, 0xa4, 0x66, 0x3f, 0xa3, 0xc2, 0xf8, 0x89, 0x69, 0x8a, 0xac, 0xcc, 0x15,
0x5e, 0xdd, 0x63, 0xda, 0xe3, 0x5a, 0x1f, 0xe9, 0x81, 0x60, 0x20, 0x60, 0xc1, 0xf9, 0xbb, 0x71,
0x87, 0x77, 0x79, 0xe0, 0x90, 0x3d, 0xef, 0x49, 0xa9, 0xf7, 0x66, 0x70, 0x6f, 0x80, 0x88, 0xbe,
0x89, 0x73, 0x99, 0x3e, 0xb1, 0xf9, 0xd6, 0xe7, 0xb1, 0x9f, 0x3e, 0xfe, 0x39, 0xed, 0x36, 0x18,
0xee, 0xc3, 0x41, 0xbb, 0x69, 0x9a, 0x8b, 0xb1, 0x13, 0x2d, 0xd5, 0xab, 0xb7, 0xb6, 0x3b, 0xed,
0xdf, 0x5b, 0x08, 0xde, 0x7d, 0xe5, 0x5d, 0xfa, 0x32, 0x91, 0x78, 0x03, 0x87, 0x77, 0x85, 0xc2,
0x92, 0x66, 0x51, 0x83, 0xdb, 0xa8, 0x3f, 0xce, 0x17, 0xaa, 0xf5, 0xbb, 0x1e, 0x5c, 0x5f, 0x2e,
0xb6, 0x6c, 0x6d, 0x1a, 0x98, 0x84, 0xe4, 0x69, 0x44, 0x9a, 0xf5, 0x6e, 0xd8, 0xd4, 0xc9, 0xd3,
0x42, 0x18, 0xca, 0x80, 0x1c, 0x71, 0x8c, 0x62, 0x79, 0x59, 0xd9, 0x3b, 0xf3, 0xba, 0x90, 0x6b,
0x36, 0x2a, 0x7c, 0xf8, 0xd3, 0xf4, 0xaa, 0xd9, 0x17, 0x59, 0xb1, 0xe6, 0x5a, 0x50, 0xcb, 0x0b,
0x6b, 0x19, 0x0c, 0xe0, 0x5e, 0x67, 0x09, 0x42, 0x53, 0x71, 0x8b, 0xc2, 0x4e, 0x46, 0xc3, 0xff,
0xf1, 0x45, 0x2b, 0x81, 0x52, 0x3b, 0xb4, 0x59, 0x20, 0xdc, 0x24, 0xea, 0xa5, 0xe7, 0xfc, 0x19,
0xc2, 0xeb, 0x8c, 0x91, 0x99, 0x0a, 0x87, 0x43, 0xa7, 0x4c, 0x3e, 0x5a, 0xd7, 0x71, 0x5e, 0x3f,
0x7c, 0xd0, 0x2f, 0x1a, 0xc0, 0xac, 0x73, 0xcf, 0xfc, 0x0a, 0x85, 0xe8, 0xd6, 0xb1, 0xa2, 0xe0,
0x2e, 0x7a, 0xa8, 0x68, 0x68, 0x0a, 0x7d, 0x73, 0xd0, 0xc7, 0x6a, 0x3e, 0x7b, 0x6b, 0x6a, 0x28,
0x59, 0x7a, 0x29, 0x85, 0x84, 0x04, 0xbb, 0x7c, 0x5b, 0x8f, 0x68, 0x6f, 0xb7, 0x3e, 0xbf, 0xca,
0x97, 0x62, 0x7a, 0x73, 0xf3, 0xe3, 0x23, 0x39, 0xa6, 0xb1, 0x71, 0xd0, 0x4e, 0xb5, 0x7a, 0x29,
0x51, 0xc9, 0x40, 0x45, 0x2f, 0x25, 0x58, 0x0c, 0x71, 0x61, 0x9c, 0x73, 0x99, 0xc8, 0xab, 0xee,
0x67, 0x0d, 0x97, 0xd3, 0xdc, 0xa0, 0x90, 0x3b, 0xc2, 0x91, 0x07, 0x1f, 0xf0, 0xe9, 0x97, 0xa9,
0xb5, 0x46, 0xdc, 0x63, 0xfc, 0xa3, 0x24, 0x1f, 0xeb, 0xa8, 0x85, 0x66, 0x9a, 0xaf, 0x0f, 0x37,
0xe0, 0x8e, 0x01, 0x32, 0x35, 0xdb, 0xbe, 0xa3, 0xbe, 0xf6, 0x2f, 0x1a, 0xd8, 0x1e, 0xc6, 0x40,
0xb9, 0x69, 0xea, 0x02, 0x95, 0x14, 0x9b, 0xe9, 0x7d, 0x0c, 0xb7, 0x55, 0xf8, 0x87, 0xd9, 0x76,
0x3e, 0x15, 0xae, 0x83, 0xba, 0xe7, 0x60, 0xc4, 0x0d, 0x32, 0x8a, 0x46, 0x9a, 0x56, 0xdc, 0xc1,
0x62, 0x9e, 0x76, 0xf6, 0x34, 0xfb, 0xb9, 0xca, 0x32, 0xaa, 0xdd, 0x2b, 0x4e, 0xd2, 0xbc, 0x1a,
0xe4, 0x5d, 0x8c, 0x79, 0xb1, 0x84, 0xd3, 0xfc, 0xd5, 0x40, 0xa9, 0x00, 0x97, 0x18, 0x39, 0xf7,
0x78, 0xa7, 0xfd, 0x60, 0xb4, 0xfa, 0x3f, 0x8b, 0x74, 0x23, 0xb6, 0x90, 0x07, 0x32, 0xea, 0xde,
0x4d, 0xe9, 0xbf, 0xe3, 0x78, 0x0a, 0xe0, 0x86, 0x21, 0x02, 0x2d, 0x45, 0xe0, 0x74, 0x20, 0xb7,
0x63, 0x17, 0x2f, 0x09, 0xd3, 0xbe, 0x24, 0x6e, 0xef, 0x62, 0x06, 0x35, 0x1d, 0x0d, 0xe0, 0xb8,
0xc4, 0xff, 0xc5, 0x3e, 0x4a, 0xf3, 0x04, 0x2b, 0x4f, 0xea, 0xf6, 0xfd, 0x8d, 0x28, 0x5e, 0xdc,
0xe8, 0x1d, 0x39, 0x20, 0x43, 0x89, 0x5c, 0x37, 0x50, 0x38, 0x92, 0x00, 0x69, 0x46, 0xc8, 0x55,
0x16, 0x70, 0x90, 0x73, 0x9e, 0xd8, 0x08, 0xdb, 0x3a, 0xcf, 0x5c, 0xc8, 0xdb, 0x2b, 0xae, 0x8e,
0x7c, 0x51, 0xa9, 0x0c, 0x54, 0xc8, 0x15, 0x21, 0x26, 0x29, 0x92, 0x25, 0x19, 0xa8, 0x31, 0x7c,
0x7d, 0x41, 0x32, 0x69, 0xe4, 0xfd, 0xf0, 0x0f, 0x12, 0x2e, 0x35, 0x0d, 0x22, 0x04, 0xf5, 0x7e,
0x5c, 0xa7, 0x2e, 0xe1, 0xda, 0x11, 0xd2, 0xbf, 0x98, 0xe1, 0x33, 0xf7, 0x3c, 0xb2, 0x4a, 0x1c,
0x01, 0x3e, 0xf7, 0xcc, 0x14, 0x2a, 0x51, 0xe6, 0x4f, 0x43, 0xba, 0xd4, 0xad, 0xb7, 0x8c, 0x5c,
0x4a, 0x44, 0x03, 0x7f, 0x80, 0x0f, 0xe5, 0x58, 0x35, 0x44, 0x11, 0x13, 0x63, 0xd6, 0x62, 0x48,
0x15, 0xa9, 0xb9, 0xdf, 0xf9, 0xc1, 0x70, 0x80, 0xdf, 0x76, 0xda, 0x93, 0x50, 0xc3, 0x17, 0x5b,
0xb7, 0xdd, 0xfa, 0x14, 0x5a, 0xfa, 0x2f, 0xd6, 0x4b, 0x54, 0xd8, 0x41, 0xab, 0x82, 0xc9, 0x12,
0xd8, 0x65, 0x71, 0x99, 0xff, 0x07, 0x3b, 0x46, 0x84, 0xeb, 0x89, 0x04, 0x10, 0x6d, 0x5c, 0x1e,
0xe4, 0xcb, 0x13, 0xcd, 0x37, 0x3b, 0xde, 0x78, 0xfc, 0x48, 0xbd, 0xb2, 0x85, 0x89, 0x45, 0x72,
0x96, 0x2a, 0x7d, 0x69, 0x1a, 0x59, 0x6d, 0x03, 0x30, 0xb9, 0xce, 0x98, 0xb3, 0xc2, 0x23, 0xb4,
0x86, 0x2a, 0x1e, 0x76, 0x49, 0xc0, 0x7b, 0xd6, 0x3c, 0x54, 0x76, 0x22, 0x1c, 0x8e, 0x86, 0x56,
0xeb, 0xa3, 0x00, 0x73, 0x3c, 0xeb, 0x64, 0xa1, 0xd7, 0x4a, 0xeb, 0x4d, 0x98, 0x49, 0xcf, 0x93,
0x72, 0xec, 0x35, 0x33, 0x8b, 0x97, 0xf4, 0xd0, 0xb7, 0x80, 0xf8, 0xc4, 0x85, 0x27, 0x1f, 0x5e,
0x3c, 0xe9, 0x83, 0x3d, 0xbc, 0x99, 0x96, 0x3d, 0x63, 0xaa, 0x99, 0x7c, 0x83, 0x07, 0x55, 0x78,
0x94, 0x7f, 0xa4, 0x48, 0x77, 0x38, 0xa3, 0xb8, 0xb7, 0x02, 0xee, 0x82, 0xac, 0x27, 0x1e, 0xb4,
0x2a, 0xa9, 0x27, 0x98, 0xcf, 0x58, 0x80, 0xa6, 0x58, 0x15, 0xce, 0x17, 0x87, 0xb4, 0xff, 0xaf,
0x22, 0xa8, 0xf3, 0x83, 0xf6, 0xd9, 0x04, 0xb3, 0xbb, 0xf1, 0x1a, 0xa7, 0x00, 0x5c, 0x64, 0xfb,
0x99, 0x6f, 0x54, 0xda, 0x29, 0x1e, 0x4f, 0xae, 0x22, 0x24, 0xce, 0xc8, 0x77, 0xc8, 0x7e, 0xe6,
0xfd, 0xce, 0x07, 0x7d, 0x0d, 0x93, 0xde, 0x13, 0xd3, 0x08, 0xdb, 0xc1, 0xd5, 0xbb, 0x5a, 0x69,
0x34, 0xa5, 0x90, 0x44, 0x5b, 0xd2, 0x50, 0x4c, 0x03, 0xb4, 0x35, 0x33, 0x4d, 0x63, 0xdb, 0xfb,
0xe7, 0xed, 0x07, 0x91, 0x1f, 0x7e, 0xa5, 0x68, 0xa0, 0xe7, 0x80, 0x65, 0xf8, 0x79, 0xc7, 0xca,
0x80, 0x27, 0x41, 0x59, 0xa3, 0x38, 0xc3, 0xae, 0xa5, 0x8c, 0x1d, 0x00, 0xb5, 0xbc, 0x6d, 0x16,
0xdf, 0x8e, 0x36, 0xa6, 0x24, 0x8e, 0x1d, 0xca, 0x0c, 0x13, 0xed, 0x3d, 0xe1, 0x68, 0xc9, 0x0b,
0x8b, 0xd4, 0x17, 0xf2, 0xb3, 0xec, 0x78, 0xa0, 0x7d, 0x35, 0x71, 0xe4, 0x24, 0xd1, 0xe5, 0xc1,
0x13, 0x2c, 0x7e, 0xab, 0x86, 0x19, 0xfe, 0xbe, 0x22, 0xcf, 0xb7, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xae, 0x29, 0x35, 0xf1, 0xdf, 0xd8, 0xa2, 0x4a, 0xed, 0x7c, 0x70, 0xdf,
0x7d, 0xe3, 0xa6, 0x68, 0xeb, 0x7a, 0x49, 0xb1, 0x31, 0x98, 0x80, 0xdd, 0xe2, 0xbb, 0xd9, 0x03,
0x1a, 0xe5, 0xd8, 0x2f, 0xfd, 0xe0, 0x1c, 0x85, 0xa0, 0x45, 0xcc, 0x0e, 0xf3, 0x67, 0x88, 0xe9,
0x1e, 0xdf, 0x18, 0xe6, 0x3a, 0x44, 0x94, 0x53, 0x74, 0x09, 0x4e, 0x08, 0x3c, 0x33, 0xd3, 0x07,
0xd1, 0x72, 0xaf, 0x7f, 0x82, 0xec, 0x14, 0x05, 0x87, 0x12, 0x50, 0xc0, 0xc4, 0x4f, 0x7c, 0x67,
0xdf, 0xd2, 0xe2, 0xc7, 0x38, 0x0d, 0x7c, 0x30, 0xf6, 0x80, 0x39, 0xe2, 0x7d, 0x77, 0xb4, 0x42,
0xcb, 0x01, 0x63, 0xca, 0x95, 0x32, 0xa4, 0x18, 0x2c, 0x2b, 0xef, 0xa0, 0x26, 0x88, 0xc6, 0x01,
0x97, 0x10, 0xba, 0xba, 0x3d, 0x80, 0xf2, 0xb8, 0x94, 0xfd, 0x91, 0x75, 0xf2, 0x2c, 0x7f, 0xf6,
0xdf, 0x41, 0x2c, 0x8c, 0x41, 0xde, 0xb3, 0x94, 0xb9, 0x89, 0xc2, 0x27, 0xf5, 0xc2, 0x03, 0x32,
0xb7, 0xa0, 0x30, 0x36, 0x98, 0x23, 0xc6, 0xac, 0x19, 0xee, 0xa1, 0xe6, 0xe2, 0x68, 0xee, 0xaa,
0x70, 0x0c, 0x81, 0xe8, 0x87, 0x31, 0xbf, 0x74, 0xaa, 0xd7, 0x37, 0xab, 0xf9, 0x15, 0x8c, 0x3e,
0xfc, 0x59, 0x16, 0x20, 0x4e, 0xe3, 0xd4, 0x5e, 0x57, 0x28, 0xcf, 0x42, 0x7f, 0x1a, 0x86, 0x9d,
0x1c, 0x5d, 0x4a, 0xf1, 0x7a, 0x17, 0x9e, 0xd1, 0x6f, 0xfd, 0xcd, 0xb4, 0xe9, 0x05, 0xdb, 0x8e,
0x10, 0x99, 0x25, 0x41, 0x2c, 0xa6, 0xf6, 0x65, 0xd3, 0x4f, 0x3c, 0x3d, 0xc9, 0x2c, 0xf5, 0x40,
0xea, 0x6d, 0x7a, 0x07, 0xdf, 0x9c, 0x3b, 0x3f, 0xe7, 0x45, 0xd8, 0xcf, 0x95, 0x33, 0x57, 0x39,
0x37, 0x61, 0x36, 0x7c, 0xf7, 0xee, 0xb5, 0xc0, 0x75, 0x0b, 0xe3, 0x08, 0x02, 0xfe, 0x8f, 0x52,
0x14, 0xa4, 0x1f, 0x99, 0xbe, 0x8d, 0xb8, 0x1f, 0x35, 0xf1, 0x96, 0x61, 0x31, 0x19, 0x20, 0xd8,
0x1c, 0xdb, 0x99, 0x9f, 0x34, 0x68, 0xf0, 0x16, 0x05, 0x5d, 0x33, 0xbc, 0x8e, 0xa9, 0x50, 0xda,
0x3f, 0x07, 0xc0, 0xf1, 0x02, 0x61, 0x88, 0xe2, 0x8b, 0x50, 0xc9, 0xad, 0x30, 0xab, 0x00, 0x05,
0xea, 0x60, 0x4c, 0xcf, 0x86, 0xb0, 0x32, 0x40, 0x1a, 0x6b, 0x84, 0xf9, 0xee, 0xee, 0x1c, 0x82,
0xf6, 0xbc, 0xd3, 0x88, 0x7c, 0xb9, 0x87, 0x88, 0x8c, 0x1e, 0xc2, 0x55, 0x37, 0xc6, 0x60, 0xdc,
0xf8, 0x1d, 0xbc, 0x80, 0x06, 0x33, 0x33, 0x61, 0x99, 0xce, 0x7c, 0x41, 0xea, 0xf2, 0xc8, 0x92,
0x0c, 0xd3, 0xd6, 0xf4, 0x1b, 0xa7, 0x8d, 0x97, 0xb9, 0x84, 0x51, 0x65, 0x6e, 0xcb, 0x7a, 0x73,
0x97, 0x0a, 0xfd, 0xaa, 0x36, 0xb9, 0xb1, 0x5e, 0x8d, 0xe1, 0xcf, 0x85, 0x2c, 0x5c, 0x41, 0xee,
0x6c, 0xbc, 0x0e, 0x76, 0x80, 0x5a, 0xa9, 0x3c, 0x3f, 0xa9, 0x33, 0xc4, 0x3d, 0x12, 0x5d, 0x0b,
0x00, 0x68, 0x7d, 0x15, 0x30, 0x37, 0xe2, 0x4d, 0x4f, 0x49, 0x30, 0x0c, 0x93, 0x2c, 0x18, 0xdd,
0x1f, 0x92, 0xab, 0xef, 0x0a, 0x2c, 0x12, 0x4c, 0x4e, 0x99, 0xee, 0xcb, 0x95, 0x68, 0xf1, 0xf8,
0x88, 0x8c, 0xe1, 0x16, 0x2d, 0x08, 0x6a, 0x5a, 0xb1, 0x87, 0xb4, 0x9f, 0x6b, 0x16, 0xb6, 0x69,
0xb0, 0x40, 0xbc, 0x9c, 0x54, 0x61, 0xa2, 0x65, 0x97, 0x29, 0xa0, 0xfa, 0x12, 0x7b, 0xc5, 0xdb,
0xcf, 0x6a, 0x54, 0xfc, 0xc8, 0x93, 0xd0, 0xdf, 0x06, 0x7a, 0xd7, 0x44, 0x0c, 0x80, 0x35, 0xe1,
0xcf, 0x18, 0xc5, 0xb4, 0x19, 0xf3, 0x9c, 0x97, 0x3b, 0x1a, 0x91, 0xbd, 0x54, 0x0c, 0x37, 0x6b,
0x14, 0x1d, 0xfe, 0x5c, 0xea, 0xb4, 0x3c, 0x71, 0x16, 0x21, 0x1e, 0xa0, 0x14, 0x13, 0x8d, 0xaf,
0xbd, 0x24, 0xb2, 0x9a, 0xf4, 0x82, 0xab, 0x03, 0xb7, 0x77, 0x00, 0x6f, 0x99, 0x6f, 0xa4, 0x89,
0xe7, 0x6f, 0xf9, 0xc2, 0x30, 0x3c, 0x1f, 0xe4, 0x69, 0x27, 0x53, 0x40, 0x16, 0xf1, 0x9e, 0xae,
0xe7, 0xd1, 0xaf, 0x02, 0xf7, 0xb1, 0x13, 0x1a, 0x3e, 0x16, 0x1b, 0x2d, 0x18, 0xfd, 0xbf, 0xb8,
0x61, 0xeb, 0xf7, 0x8d, 0xe8, 0x5b, 0xa0, 0xee, 0x0e, 0x56, 0xe6, 0xe1, 0x5c, 0x4a, 0x09, 0x51,
0x41, 0xfa, 0x0c, 0xa8, 0xfc, 0x1a, 0x8d, 0x00, 0x14, 0x4d, 0x82, 0x85, 0x9e, 0x62, 0x7b, 0x70,
0x06, 0x0b, 0x6a, 0xd7, 0xb1, 0x82, 0x46, 0x49, 0xcf, 0x3b, 0x76, 0x57, 0xd0, 0x27, 0x44, 0xac,
0xb8, 0xb3, 0x74, 0x6b, 0x3a, 0x1c, 0x2b, 0xdb, 0x5c, 0x9a, 0x57, 0x1c, 0x79, 0xee, 0x80, 0x1d,
0x6a, 0x8d, 0xbb, 0xfd, 0xc1, 0x70, 0x4e, 0x9b, 0xa0, 0xd3, 0x29, 0x3e, 0xe1, 0x61, 0xe5, 0xe9,
0x69, 0x59, 0xf6, 0x3f, 0x55, 0x5e, 0x0f, 0x8a, 0x4a, 0x99, 0x95, 0xa4, 0x97, 0x71, 0xd0, 0x72,
0x36, 0xb4, 0x20, 0x0a, 0xce, 0x69, 0xab, 0xdc, 0xf9, 0xa4, 0x66, 0xd3, 0x0e, 0x81, 0xca, 0x93,
0xa9, 0xb9, 0xd1, 0x92, 0x41, 0xa3, 0x09, 0x57, 0xcb, 0x05, 0x28, 0xaf, 0xea, 0x86, 0xe1, 0xf1,
0x9c, 0x7d, 0x38, 0x58, 0x97, 0x6d, 0x50, 0xa6, 0xef, 0xf6, 0xbf, 0x8b, 0x29, 0x8d, 0xbb, 0x86,
0x48, 0x52, 0x58, 0x8f, 0x88, 0x55, 0x8a, 0x05, 0x40, 0xa0, 0x7c, 0x72, 0xb6, 0xdd, 0xa9, 0x48,
0x77, 0xdc, 0xee, 0xbc, 0xd3, 0x6f, 0x95, 0x9f, 0x51, 0xa8, 0x5d, 0x7a, 0x61, 0x06, 0x6a, 0x78,
0x1c, 0xb9, 0xcf, 0xa9, 0xf7, 0x88, 0x81, 0x97, 0x53, 0x5f, 0x62, 0x58, 0xb2, 0x8d, 0x71, 0xce,
0xf4, 0x05, 0x16, 0x8b, 0x4a, 0xa3, 0xdd, 0x35, 0xfa, 0xdd, 0xd9, 0x95, 0xde, 0xb5, 0x26, 0x0d,
0xf8, 0x73, 0x26, 0xb6, 0x5c, 0x09, 0x2b, 0x49, 0xac, 0x66, 0x91, 0x33, 0x5f, 0x44, 0xbe, 0x13,
0xd1, 0x64, 0x44, 0xe4, 0x86, 0x4a, 0xdd, 0xde, 0x2e, 0x2c, 0xe1, 0x89, 0x32, 0x66, 0x14, 0x2e,
0x75, 0x74, 0xe6, 0x47, 0xf9, 0x74, 0x11, 0xe3, 0x00, 0x3f, 0x13, 0x07, 0xbc, 0x09, 0x88, 0x4b,
0x51, 0xf6, 0x91, 0xb7, 0x45, 0xaf, 0xaf, 0x69, 0x7b, 0x4f, 0x77, 0x7d, 0x2e, 0xc7, 0x5c, 0x2c,
0x4f, 0xae, 0x5a, 0x80, 0x6a, 0xef, 0xba, 0x3e, 0x2c, 0x93, 0x63, 0x3a, 0xe4, 0xce, 0x75, 0xe1,
0xce, 0x38, 0xf7, 0x84, 0xe1, 0xfa, 0x6f, 0x3e, 0x20, 0x17, 0x3a, 0xe7, 0x99, 0x24, 0xc1, 0x2f,
0x98, 0x32, 0xe4, 0xca, 0x89, 0x80, 0x9c, 0x68, 0x50, 0xb1, 0x56, 0x7e, 0x5f, 0x51, 0x2c, 0x79,
0x05, 0x16, 0x10, 0xf0, 0x7e, 0x8b, 0x09, 0xaa, 0xb1, 0xf5, 0xcf, 0xb9, 0x18, 0x14, 0x5e, 0xfd,
0xc0, 0x08, 0xbd, 0x65, 0x1f, 0x7c, 0x1b, 0x2e, 0x0b, 0x7e, 0xc8, 0xbb, 0x32, 0x71, 0x83, 0x2c,
0x67, 0x82, 0x32, 0xfb, 0xcb, 0x22, 0xe0, 0xff, 0x9b, 0xc1, 0x0a, 0x54, 0xe7, 0xdb, 0x86, 0x23,
0x00, 0x04, 0x08, 0x06, 0xd1, 0x5a, 0x8f, 0xc9, 0xe3, 0x3a, 0x9b, 0x51, 0xeb, 0xfd, 0xb2, 0xf3,
0x27, 0x45, 0xa1, 0xeb, 0xdc, 0xd0, 0xf9, 0xa7, 0x70, 0x23, 0xec, 0xc4, 0x29, 0xf1, 0xce, 0x52,
0x89, 0xa2, 0xcb, 0xa0, 0x45, 0x6d, 0xa5, 0xa7, 0x73, 0xf4, 0xd7, 0x4c, 0x48, 0xd9, 0x15, 0xb9,
0xe9, 0x87, 0x84, 0x30, 0xfe, 0x0d, 0xf6, 0x45, 0x88, 0xa4, 0x29, 0x26, 0x5d, 0xde, 0xc9, 0x0f,
0xea, 0x4c, 0xb3, 0xe1, 0x48, 0x9f, 0x03, 0x99, 0x8f, 0xb6, 0x78, 0xa1, 0xaa, 0x7a, 0xa3, 0x99,
0xb9, 0x0c, 0xcf, 0x22, 0xc5, 0x6e, 0x51, 0x82, 0xcb, 0x14, 0xbd, 0x5e, 0x03, 0xc1, 0xe1, 0xc2,
0xec, 0x68, 0x09, 0xb0, 0x20, 0x06, 0xa9, 0x1c, 0x64, 0xdc, 0x8d, 0xac, 0x8c, 0xbb, 0x1c, 0xb7,
0x6b, 0x80, 0x58, 0x92, 0x85, 0xe4, 0x2c, 0x98, 0xfa, 0x44, 0xd9, 0xe0, 0xfd, 0x67, 0xb4, 0xa1,
0xfc, 0x02, 0xfd, 0x82, 0x0c, 0xac, 0xa3, 0x6f, 0x20, 0x54, 0x5e, 0x22, 0xfe, 0xb1, 0x2d, 0xad,
0x46, 0x72, 0x5d, 0x78, 0xea, 0xb3, 0xd4, 0x65, 0xa5, 0xd2, 0x85, 0xa2, 0xe9, 0xb2, 0xbc, 0xf6,
0xdf, 0x32, 0xa3, 0x2a, 0x91, 0x26, 0x1b, 0x18, 0x05, 0x23, 0x19, 0xb5, 0x1e, 0x3c, 0x6a, 0x29,
0x7d, 0xc3, 0x6e, 0x52, 0xc7, 0xf2, 0x50, 0x29, 0x67, 0xfb, 0xeb, 0x0a, 0xd0, 0xdb, 0xf7, 0x0c,
0x8a, 0x25, 0x70, 0xb8, 0xf7, 0x15, 0x88, 0xfb, 0x28, 0x91, 0xef, 0xf0, 0xa2, 0x3c, 0x28, 0xdd,
0x2f, 0x4f, 0xd0, 0xf6, 0x26, 0xa4, 0xdb, 0x65, 0x3b, 0x39, 0x61, 0x43, 0xc6, 0xf8, 0x68, 0xd6,
0x55, 0xe2, 0xd5, 0x85, 0x03, 0x9c, 0x89, 0x1a, 0x11, 0xff, 0xf1, 0x37, 0x76, 0x8d, 0x05, 0xf7,
0x5c, 0x27, 0xb8, 0xd3, 0x79, 0xad, 0x02, 0xca, 0xb0, 0x52, 0xec, 0x67, 0x89, 0xfb, 0xb1, 0x28,
0x72, 0xae, 0x32, 0x2f, 0xde, 0x58, 0x2c, 0x8e, 0x6d, 0x87, 0xb3, 0x3f, 0xb8, 0x44, 0x7e, 0x81,
0x76, 0x29, 0x4b, 0xe9, 0xdf, 0x99, 0xc7, 0x43, 0xde, 0xb2, 0xe3, 0xf9, 0xf9, 0x1c, 0x8a, 0x3b,
0x58, 0x88, 0xf6, 0x0e, 0x1e, 0x7f, 0x9f, 0x49, 0xb0, 0x49, 0xba, 0xdb, 0x6d, 0x59, 0xdf, 0x42,
0x8e, 0xa4, 0x13, 0x80, 0xb5, 0x01, 0x90, 0xd9, 0x6f, 0xf7, 0x2e, 0xba, 0x28, 0x7c, 0xa5, 0x5f,
0x32, 0x43, 0x99, 0x64, 0xa9, 0xa5, 0x9b, 0xa8, 0xc0, 0x99, 0x03, 0x08, 0x02, 0x10, 0xde, 0xa1,
0x75, 0xc9, 0x72, 0xa7, 0x66, 0x7a, 0x66, 0xca, 0xb9, 0x36, 0xd0, 0x98, 0xaf, 0xdf, 0x2d, 0xc3,
0xac, 0x5c, 0xda, 0x1c, 0x66, 0xea, 0xb7, 0x3e, 0x89, 0x32, 0x54, 0xb3, 0x57, 0xa5, 0x4f, 0x9a,
0xda, 0x6b, 0x11, 0x21, 0x79, 0x15, 0x7e, 0xb1, 0x92, 0x64, 0x07, 0xe8, 0x8f, 0x40, 0x19, 0xbf,
0x7b, 0x34, 0x1d, 0xd5, 0xbb, 0x0e, 0xbc, 0xd3, 0xd9, 0x88, 0x59, 0xe1, 0xd2, 0xe2, 0x8a, 0x25,
0xd8, 0x6c, 0x34, 0x8c, 0xab, 0xca, 0x24, 0x51, 0xbf, 0xcd, 0x7d, 0x1a, 0x88, 0x0e, 0x41, 0x0f,
0xcf, 0x10, 0x62, 0x40, 0xf1, 0xef, 0x38, 0xf9, 0x14, 0x52, 0x9a, 0x6f, 0xd3, 0xf9, 0x6b, 0x98,
0x4f, 0x19, 0x6c, 0x07, 0xec, 0xcf, 0x36, 0x53, 0x77, 0x58, 0x23, 0x56, 0x08, 0x65, 0xdb, 0x24,
0x1c, 0xd2, 0xdb, 0x62, 0x5f, 0xdc, 0x1c, 0x01, 0x49, 0xf6, 0x8c, 0x21, 0x6f, 0x71, 0x22, 0x5f,
0x02, 0xb5, 0x00, 0x49, 0x28, 0x11, 0xc1, 0x3c, 0xba, 0x69, 0xdc, 0x7f, 0xcb, 0xc7, 0xa8, 0x8d,
0xf5, 0xee, 0xe4, 0x4b, 0x53, 0x8d, 0x01, 0xa3, 0xd1, 0x82, 0x88, 0x28, 0x03, 0x42, 0xed, 0x20,
0x4b, 0xca, 0xb0, 0x3a, 0x4e, 0x05, 0xee, 0x42, 0xc1, 0xd8, 0xd6, 0x2c, 0x64, 0xd6, 0x83, 0x03,
0xc1, 0x21, 0x75, 0xd4, 0xce, 0x5d, 0x83, 0x9b, 0x74, 0x88, 0x51, 0x14, 0x9c, 0x5e, 0x73, 0xe5,
0xaf, 0x1e, 0x12, 0xae, 0xb9, 0xc3, 0x2d, 0xd7, 0x09, 0xf8, 0x4b, 0x2e, 0x14, 0xcf, 0x94, 0x17,
0xf6, 0xc8, 0x28, 0xbf, 0x6b, 0xd9, 0x33, 0x4c, 0x4c, 0xab, 0x2e, 0xa4, 0x3a, 0xe7, 0x6b, 0x3d,
0xe0, 0xc4, 0x35, 0xc1, 0xb3, 0x7f, 0x9e, 0xcc, 0x65, 0xeb, 0xed, 0xd8, 0x15, 0x27, 0x11, 0x66,
0x20, 0x68, 0xaa, 0xf3, 0xa0, 0xf3, 0xa8, 0x6f, 0x51, 0x63, 0x42, 0xcf, 0xba, 0x10, 0x4f, 0x04,
0xdf, 0x64, 0x87, 0x88, 0xda, 0x49, 0x3e, 0xbf, 0xa2, 0x21, 0xd6, 0x31, 0xac, 0x9f, 0xf2, 0xf8,
0xd1, 0x5c, 0xf8, 0x89, 0x72, 0x0c, 0x9e, 0x24, 0x30, 0xc1, 0x9f, 0xd9, 0x36, 0xae, 0xcc, 0xcc,
0xbb, 0x09, 0xf2, 0xc3, 0x5c, 0xf9, 0x33, 0x87, 0x58, 0xb5, 0x47, 0x69, 0x26, 0x23, 0x57, 0x98,
0xa4, 0x62, 0xa9, 0x0d, 0x70, 0xa7, 0x2d, 0xce, 0x6f, 0x55, 0x05, 0x8f, 0x8b, 0x51, 0x5b, 0x18,
0xcd, 0x65, 0x9b, 0x47, 0xb6, 0xee, 0xd4, 0xfd, 0x72, 0x28, 0xa0, 0x94, 0xa2, 0xd7, 0xd2, 0xef,
0x5a, 0xae, 0xc1, 0xf3, 0x6b, 0x5c, 0xa4, 0x54, 0xdb, 0x48, 0xec, 0xfd, 0xe1, 0xe9, 0x5e, 0x8c,
0x62, 0x4c, 0xf7, 0x7a, 0x50, 0x62, 0xeb, 0xdf, 0x54, 0x6a, 0x49, 0x6f, 0xdb, 0x5a, 0x02, 0x96,
0xf9, 0x1d, 0x57, 0x8e, 0xa1, 0x61, 0xaa, 0xc7, 0xc7, 0xa8, 0x1b, 0xf5, 0x33, 0x3d, 0x65, 0x12,
0x45, 0x54, 0xfc, 0x9d, 0x40, 0x17, 0x7c, 0xff, 0xf4, 0x2e, 0x0b, 0xbd, 0x56, 0x80, 0x5c, 0x83,
0x7f, 0xe6, 0x20, 0x3f, 0x6e, 0x91, 0xa2, 0x2c, 0x58, 0x33, 0x69, 0xbc, 0x15, 0x10, 0xdc, 0x2d,
0xa3, 0xd6, 0x06, 0xa9, 0xce, 0xa7, 0xec, 0xa8, 0x28, 0x14, 0xbe, 0xbe, 0x80, 0x82, 0x8f, 0x1d,
0x4c, 0x24, 0x40, 0x26, 0x68, 0xdd, 0xa9, 0xaa, 0x4c, 0xd6, 0x87, 0x7e, 0x46, 0x7a, 0xaa, 0x43,
0x56, 0x2e, 0xd9, 0x24, 0xda, 0x6f, 0xdd, 0x21, 0x10, 0x39, 0x48, 0xd5, 0x08, 0xec, 0x5d, 0x1f,
0xe4, 0xdb, 0x64, 0xa1, 0x99, 0x8b, 0x11, 0x60, 0x2f, 0x4b, 0x44, 0x84, 0xd2, 0x69, 0x52, 0xfd,
0xee, 0xe9, 0x5b, 0xb0, 0xa8, 0xc5, 0x07, 0x77, 0x15, 0xfe, 0x58, 0xf5, 0x62, 0xfb, 0x60, 0x4c,
0x43, 0xe0, 0x17, 0x54, 0x42, 0x9f, 0x07, 0x7c, 0x2d, 0xc0, 0xa2, 0x6a, 0x3e, 0x13, 0x0b, 0x78,
0x5c, 0x62, 0x98, 0x7f, 0x55, 0xe2, 0xc7, 0xb2, 0x58, 0xe1, 0x9d, 0x53, 0xb5, 0xd9, 0xaf, 0x0c,
0x11, 0x70, 0x85, 0xca, 0x21, 0x87, 0x1a, 0x39, 0x5e, 0x67, 0xd4, 0x51, 0x75, 0x2e, 0xa8, 0xea,
0x0d, 0x30, 0xc0, 0x93, 0x60, 0x18, 0x7f, 0xdf, 0x4a, 0x41, 0xa0, 0x80, 0x1c, 0xed, 0x5c, 0xaa,
0x84, 0x4f, 0x2d, 0xec, 0x8c, 0xad, 0x24, 0xa1, 0x4b, 0xa9, 0x52, 0x27, 0x8e, 0x70, 0xf6, 0xff,
0xc0, 0xb4, 0x13, 0x39, 0x75, 0xd4, 0xfc, 0x9a, 0xbf, 0xff, 0x53, 0x3f, 0x44, 0x19, 0xd9, 0xa5,
0x28, 0x18, 0x5c, 0x38, 0xfb, 0x4c, 0x3e, 0x5b, 0x40, 0xf2, 0xf4, 0xc2, 0x2c, 0x95, 0xdb, 0xd2,
0xe5, 0x5f, 0x87, 0x56, 0x63, 0x28, 0xda, 0x07, 0xa9, 0x90, 0x83, 0x94, 0xdb, 0x56, 0x2c, 0xa3,
0xd0, 0xc4, 0x52, 0x6d, 0x1f, 0xfa, 0x35, 0x4f, 0xba, 0xcf, 0x12, 0xf4, 0xf0, 0x46, 0xb5, 0x1e,
0x67, 0xba, 0x10, 0xc9, 0xc3, 0x0a, 0x30, 0xed, 0xcd, 0xc4, 0x3a, 0x87, 0x08, 0x2c, 0xd9, 0x21,
0x5f, 0x68, 0x0f, 0xf8, 0x2f, 0x6f, 0x2a, 0x27, 0x47, 0x79, 0x16, 0x52, 0x7a, 0xfd, 0x9d, 0x65,
0xec, 0x53, 0x90, 0xaf, 0xf0, 0x45, 0x24, 0x08, 0x5a, 0x9f, 0xfd, 0xec, 0xd9, 0x9a, 0x4c, 0x0a,
0xd4, 0x09, 0x58, 0xdd, 0x29, 0xe4, 0x1a, 0x8e, 0xe9, 0xa3, 0x60, 0x85, 0xd8, 0xd5, 0x9c, 0xb7,
0x33, 0x2c, 0x3a, 0xfe, 0xd7, 0x09, 0x5a, 0x7a, 0x19, 0x3b, 0x67, 0xc2, 0xc9, 0xf1, 0x41, 0xa4,
0xc6, 0x7f, 0x1e, 0x7d, 0x6a, 0x75, 0x24, 0xce, 0xef, 0x30, 0xdc, 0x74, 0x8f, 0x2d, 0x8c, 0xf0,
0x5d, 0x2d, 0x4b, 0x0d, 0x0d, 0x1a, 0xda, 0x8b, 0xdb, 0xc9, 0xac, 0xeb, 0x51, 0x5e, 0xaa, 0xde,
0x05, 0x3c, 0x8c, 0x87, 0x09, 0x08, 0x2d, 0xd2, 0xca, 0xe6, 0x66, 0x97, 0x70, 0x38, 0x0e, 0x28,
0x53, 0x4b, 0x59, 0x85, 0x6a, 0x59, 0xe2, 0xd2, 0x6f, 0x87, 0x4f, 0x4b, 0xf5, 0xe1, 0x4d, 0xc9,
0x23, 0xdd, 0xfe, 0x77, 0x44, 0x92, 0x3f, 0xf6, 0x78, 0x93, 0x18, 0x38, 0x02, 0x24, 0x22, 0x89,
0xb7, 0x59, 0x84, 0x7d, 0xe4, 0xf7, 0x67, 0xaa, 0xb8, 0xd4, 0x03, 0x92, 0x97, 0xfd, 0xaa, 0xb0,
0x5d, 0xee, 0x1a, 0x48, 0xb1, 0xfb, 0x1c, 0x9d, 0xaf, 0x64, 0xc3, 0xd6, 0x3e, 0xb7, 0x62, 0xf5,
0xdb, 0xea, 0x61, 0x1d, 0xde, 0xc6, 0xee, 0x6e, 0x90, 0xfd, 0x0b, 0x74, 0xd2, 0xc2, 0xf7, 0x35,
0x98, 0x78, 0x74, 0x3e, 0xb4, 0xac, 0x29, 0x4f, 0xcd, 0x95, 0x6f, 0x0a, 0x6b, 0x20, 0xee, 0xd6,
0xd8, 0x6b, 0x34, 0x51, 0xc0, 0x6f, 0x52, 0x9c, 0x4d, 0xac, 0x9a, 0x11, 0xb8, 0xb8, 0x29, 0x37,
0x8a, 0x1b, 0x8f, 0x0c, 0x3a, 0x7a, 0x24, 0xfa, 0xc9, 0x5b, 0xef, 0x94, 0x9d, 0x36, 0xf9, 0x1a,
0x5b, 0x97, 0xab, 0x0d, 0x3e, 0xc4, 0x7c, 0x9a, 0x83, 0xb7, 0x36, 0x1b, 0x2c, 0x93, 0xd2, 0x66,
0x6e, 0x6f, 0x32, 0x11, 0x2f, 0x21, 0x19, 0x96, 0x3d, 0x7c, 0x5f, 0x2e, 0x6c, 0x05, 0x34, 0x95,
0x7c, 0x1b, 0x9b, 0x33, 0xa4, 0xb2, 0x6d, 0x5f, 0xda, 0x45, 0x69, 0x0e, 0x5c, 0x1e, 0x5e, 0xa9,
0x1a, 0x31, 0xc8, 0x23, 0x78, 0x98, 0x34, 0x4b, 0xe9, 0x37, 0xd5, 0x87, 0x46, 0xec, 0x9b, 0x20,
0x50, 0x35, 0xb9, 0x95, 0xe5, 0x06, 0x50, 0xa6, 0xe1, 0xdd, 0x19, 0xf5, 0xc6, 0x96, 0xec, 0xb3,
0x08, 0x1c, 0x25, 0xad, 0x3b, 0xfc, 0x11, 0x6c, 0x9a, 0x7d, 0xd8, 0x31, 0x03, 0x24, 0xb5, 0xcb,
0x90, 0xed, 0xfc, 0x98, 0xb1, 0x46, 0xec, 0xd0, 0xa9, 0x3c, 0x1f, 0x66, 0xb5, 0xba, 0x5e, 0xf2,
0x5a, 0xd5, 0xf3, 0xdf, 0x54, 0xe7, 0x11, 0x89, 0xdc, 0xf0, 0xea, 0x09, 0x5d, 0x7a, 0x7a, 0xf6,
0x5f, 0x5d, 0x69, 0xc0, 0xbc, 0xf3, 0x73, 0x73, 0x9a, 0xd5, 0x78, 0x40, 0xe3, 0x54, 0x31, 0x45,
0xd1, 0xc0, 0x2f, 0x93, 0xbc, 0x1e, 0x2f, 0x39, 0x4e, 0xb4, 0xf0, 0x3e, 0x57, 0x7a, 0x64, 0x8d,
0x98, 0x66, 0x5d, 0x83, 0x5a, 0x6f, 0x8b, 0x5f, 0xf2, 0x7e, 0xd1, 0xc9, 0xcc, 0xbb, 0xf7, 0xaa,
0x95, 0x2e, 0x7a, 0x7d, 0x8d, 0xec, 0x37, 0x7a, 0xb5, 0xbc, 0x8d, 0x62, 0xd2, 0x32, 0x1e, 0xd7,
0x8b, 0x15, 0x06, 0x75, 0xde, 0x81, 0xab, 0xb0, 0xd4, 0x59, 0xa2, 0x25, 0x34, 0xca, 0x6d, 0xce,
0x3f, 0xa3, 0xae, 0xe6, 0x09, 0xb3, 0x33, 0xe1, 0x25, 0x56, 0x77, 0x30, 0x8b, 0xf7, 0x30, 0x0f,
0x74, 0x72, 0x36, 0x8c, 0x4b, 0x5d, 0x94, 0xbc, 0x4f, 0x5e, 0x1d, 0x8a, 0x75, 0xec, 0xd4, 0x21,
0x21, 0xa9, 0x54, 0x9c, 0xc8, 0x37, 0x28, 0x06, 0xae, 0x5c, 0x72, 0x3b, 0xa0, 0x80, 0x0d, 0x17,
0xbb, 0x22, 0xe8, 0xf7, 0xa9, 0x31, 0x7d, 0x2c, 0x13, 0x74, 0xbc, 0xa0, 0x09, 0xba, 0x5b, 0x05,
0xa4, 0xf9, 0xab, 0xb5, 0xd5, 0xd7, 0x11, 0x3f, 0xa3, 0xb4, 0x89, 0x79, 0x1c, 0x4a, 0xd8, 0xfb,
0xc6, 0x54, 0x41, 0xaf, 0x32, 0xc9, 0x71, 0xaa, 0x5a, 0xb1, 0xb5, 0xe0, 0xa0, 0x73, 0x45, 0x18,
0x73, 0x17, 0xd2, 0xcb, 0xb8, 0x70, 0x30, 0xbb, 0xce, 0x25, 0xad, 0x9e, 0x8d, 0xf3, 0x0d, 0xec,
0x26, 0x3f, 0x2c, 0x16, 0x49, 0x45, 0x68, 0xbe, 0x04, 0x3e, 0x67, 0x1a, 0xa6, 0x7e, 0xe9, 0x44,
0x63, 0x43, 0x91, 0x92, 0x25, 0x84, 0x04, 0xe6, 0xa8, 0xb7, 0xf2, 0x70, 0x86, 0xba, 0x2e, 0x34,
0x4c, 0x0f, 0x45, 0xac, 0x39, 0x8d, 0x0c, 0x59, 0x60, 0x08, 0xb2, 0x07, 0x79, 0xfd, 0xd0, 0x60,
0xad, 0x0d, 0x53, 0xa6, 0x9b, 0x02, 0x22, 0xf2, 0xbc, 0xb4, 0xbd, 0x9e, 0x8a, 0xe8, 0x3b, 0xa7,
0x76, 0x21, 0x8e, 0x59, 0x5f, 0x08, 0xb6, 0xf9, 0x4f, 0x18, 0x09, 0x8b, 0x8a, 0x94, 0x59, 0x93,
0xa3, 0x23, 0xf1, 0xdb, 0x62, 0x88, 0x30, 0xe5, 0xea, 0xf1, 0x79, 0x3a, 0xf4, 0x3a, 0x57, 0xee,
0xab, 0xa0, 0x82, 0x39, 0x44, 0xd9, 0x13, 0xb9, 0x32, 0xb4, 0x97, 0xb9, 0xa9, 0xb3, 0x23, 0x81,
0x61, 0xed, 0x96, 0x51, 0xd9, 0xc5, 0x1c, 0x1b, 0xe7, 0x2a, 0x18, 0x83, 0xdb, 0xf5, 0xf2, 0x93,
0x98, 0xd8, 0x79, 0xc3, 0x38, 0x6d, 0x86, 0x83, 0x9a, 0x80, 0x0d, 0x21, 0x5e, 0xbd, 0x7c, 0x7a,
0x32, 0xd0, 0x75, 0xea, 0xe4, 0x95, 0x01, 0xcc, 0xa3, 0x2c, 0x74, 0x97, 0x1a, 0x25, 0xc7, 0x1a,
0x38, 0xe6, 0x92, 0x8b, 0x89, 0xff, 0x56, 0xcd, 0x8d, 0x9f, 0xa0, 0x18, 0x9b, 0x00, 0xc4, 0x58,
0x38, 0x49, 0x6a, 0x87, 0x59, 0xcc, 0x3b, 0xde, 0xb1, 0x6a, 0x86, 0x12, 0x74, 0x03, 0xd7, 0x04,
0xc4, 0x63, 0xab, 0x1f, 0x5f, 0xf8, 0x4b, 0xba, 0x1d, 0x27, 0x06, 0xba, 0x68, 0xee, 0xe2, 0xd3,
0x59, 0xb1, 0xc1, 0x7b, 0x97, 0x4e, 0x36, 0x9e, 0x13, 0x62, 0x9a, 0xad, 0x75, 0xe5, 0x44, 0xaa,
0x9c, 0x5e, 0xdd, 0x05, 0x24, 0x6f, 0x44, 0x54, 0xc2, 0x5a, 0xfd, 0x4e, 0x97, 0x49, 0xfc, 0xf8,
0xe9, 0x87, 0x42, 0x7d, 0xc5, 0xd6, 0x36, 0x21, 0x20, 0x6c, 0x2c, 0x32, 0xf9, 0xca, 0x49, 0x2f,
0x7c, 0x3c, 0x24, 0x39, 0xd6, 0x91, 0xd3, 0x69, 0xf1, 0x8b, 0x91, 0x54, 0xfd, 0xa0, 0x7a, 0x01,
0x52, 0x4a, 0xee, 0xf7, 0xea, 0xac, 0x19, 0xe8, 0x26, 0x8c, 0x5b, 0x23, 0xd3, 0xa3, 0xa6, 0x44,
0xdf, 0x9c, 0x90, 0xd8, 0x09, 0x68, 0xda, 0x44, 0x50, 0x2c, 0x55, 0x44, 0xd5, 0xc2, 0x7d, 0xab,
0xb0, 0x44, 0x81, 0xe5, 0xd9, 0x89, 0x0b, 0x08, 0x7e, 0xe0, 0x15, 0x0f, 0xef, 0x80, 0xd9, 0x46,
0xef, 0x0d, 0x58, 0x9b, 0xa2, 0x5f, 0x74, 0xb4, 0x5c, 0x66, 0x84, 0x5b, 0x5d, 0x5e, 0x08, 0xd1,
0xfc, 0x8e, 0x7b, 0xb4, 0x51, 0x59, 0x17, 0xb3, 0x32, 0xdb, 0x86, 0x6a, 0x7a, 0x11, 0x74, 0x78,
0xda, 0x6b, 0x50, 0x10, 0x16, 0x04, 0x48, 0x1f, 0xc8, 0x24, 0x9f, 0x77, 0xb7, 0x39, 0x0f, 0xd4,
0xde, 0x34, 0x50, 0x3a, 0xb7, 0x2d, 0x0e, 0x6e, 0x9e, 0x15, 0x9a, 0x8e, 0x90, 0x1e, 0x93, 0xbf,
0x6b, 0xb8, 0xeb, 0x10, 0x52, 0xe4, 0x0d, 0x7f, 0x05, 0x0e, 0x5d, 0x87, 0x25, 0x8f, 0xbc, 0x7f,
0x25, 0xfa, 0xce, 0x37, 0x03, 0xac, 0x15, 0xfa, 0x46, 0x3d, 0xd5, 0x48, 0xfb, 0xf2, 0x63, 0x7b,
0xda, 0x6f, 0x37, 0xdb, 0xbe, 0xc0, 0xad, 0xac, 0xb3, 0x36, 0xe4, 0xe6, 0x15, 0xd7, 0xd4, 0xc8,
0x4e, 0xe0, 0x74, 0x3d, 0xe7, 0x31, 0x05, 0xf3, 0x42, 0x79, 0x12, 0x91, 0x56, 0x8e, 0xf7, 0xd1,
0x60, 0xd4, 0x7d, 0x28, 0x53, 0x5b, 0xe9, 0x16, 0x25, 0x17, 0x32, 0x6c, 0x3a, 0x80, 0xc8, 0x23,
0xe3, 0x54, 0xef, 0xc4, 0xfe, 0xd7, 0x21, 0xa1, 0xc1, 0x01, 0xfc, 0xad, 0x4e, 0x3d, 0x14, 0xb5,
0xd4, 0x08, 0x9d, 0xdd, 0x98, 0x6c, 0xd6, 0x26, 0x4d, 0xad, 0x83, 0x50, 0x45, 0x82, 0x0e, 0x8d,
0x1e, 0x4c, 0x7a, 0xea, 0x65, 0xb2, 0x1c, 0x75, 0x2d, 0xe3, 0x57, 0xd2, 0x26, 0x56, 0x8c, 0x46,
0xb7, 0x83, 0x61, 0x4b, 0x1d, 0xe0, 0x42, 0xa1, 0x3f, 0x9d, 0xe5, 0x37, 0xdd, 0xfa, 0x21, 0xd8,
0x45, 0x2a, 0xa5, 0xc8, 0x4f, 0x8a, 0x38, 0x0c, 0xc0, 0x7f, 0x43, 0xac, 0xfa, 0xaf, 0x8b, 0x84,
0xdf, 0x70, 0xc3, 0xf7, 0x1b, 0xff, 0x1c, 0x82, 0x66, 0xdb, 0x04, 0x27, 0xa8, 0x60, 0x38, 0xd9,
0x6a, 0x76, 0xbc, 0xd2, 0xac, 0xa7, 0x2c, 0xa7, 0x25, 0xde, 0xe2, 0xff, 0xc0, 0x30, 0xbb, 0x45,
0x3c, 0x11, 0xea, 0x3b, 0x33, 0xfb, 0x40, 0x71, 0xbe, 0xfe, 0xa6, 0x0b, 0xb9, 0xac, 0xff, 0xa9,
0xe4, 0xc6, 0x5d, 0x9a, 0x9b, 0xea, 0x10, 0x53, 0x95, 0xa3, 0x4f, 0x9b, 0xc7, 0x8c, 0x4c, 0x5e,
0x92, 0x95, 0xc1, 0x52, 0xd2, 0xe1, 0x45, 0x4a, 0x53, 0x14, 0xc1, 0xed, 0x1f, 0xba, 0x8a, 0x47,
0xc3, 0x64, 0x1e, 0x7b, 0xf6, 0x61, 0x39, 0xb8, 0x1c, 0x83, 0x59, 0x2d, 0x1e, 0xf6, 0xb4, 0x81,
0x32, 0xee, 0xe0, 0x97, 0xd2, 0x25, 0xdb, 0xa6, 0x44, 0xf0, 0xe9, 0x73, 0xa1, 0xb5, 0xfc, 0x1b,
0x04, 0xe5, 0x5d, 0x35, 0x3c, 0xe3, 0x1b, 0x4a, 0x30, 0x02, 0x29, 0x00, 0xe9, 0xda, 0xc5, 0x74,
0x6f, 0x7e, 0xb4, 0xa1, 0x4f, 0xbb, 0xfe, 0x8b, 0x36, 0x74, 0x2a, 0x4e, 0xee, 0xc6, 0x85, 0x38,
0x05, 0x74, 0xfe, 0x5c, 0xf2, 0xca, 0x39, 0xdd, 0xab, 0xca, 0xa4, 0x30, 0xf9, 0xee, 0xf1, 0x3b,
0xdd, 0x2c, 0xe0, 0x64, 0x73, 0x88, 0x9e, 0x80, 0x0f, 0xbf, 0xf8, 0x5e, 0x1a, 0x8b, 0x05, 0xea,
0x9a, 0x9a, 0xae, 0x82, 0xeb, 0x6d, 0x04, 0xbf, 0xa8, 0x25, 0xdf, 0x54, 0x17, 0x92, 0x3d, 0x52,
0x4e, 0x3c, 0x93, 0xc6, 0x5a, 0xd8, 0x50, 0xf8, 0x57, 0x42, 0xf2, 0x02, 0x9e, 0xbb, 0xf6, 0x44,
0xd7, 0x0d, 0x59, 0xdf, 0x77, 0x3b, 0x23, 0x54, 0x7b, 0xa7, 0x67, 0x75, 0xf3, 0xe5, 0x75, 0x3e,
0x9d, 0xdc, 0xe0, 0xdc, 0x75, 0xb8, 0x93, 0xf0, 0xd2, 0x5b, 0x03, 0x9c, 0x56, 0x4d, 0x22, 0xd9,
0xfd, 0x42, 0xb2, 0xcf, 0xc9, 0xb4, 0x3f, 0xe5, 0x32, 0x01, 0x75, 0x54, 0xa4, 0xdf, 0xa3, 0x43,
0xcd, 0x77, 0x25, 0x87, 0xb9, 0x74, 0x07, 0x71, 0xe8, 0xa6, 0x82, 0x82, 0x14, 0x16, 0x94, 0x45,
0x6a, 0xb1, 0x42, 0xfe, 0x7b, 0xbf, 0x08, 0xa2, 0x1d, 0x42, 0xc2, 0x79, 0x6e, 0xec, 0x50, 0x71,
0x57, 0xa5, 0x81, 0xbf, 0xe4, 0x52, 0x68, 0xf1, 0xd4, 0xc9, 0xdb, 0x34, 0x2d, 0x9e, 0xda, 0x2f,
0x29, 0xda, 0x43, 0x6a, 0xc6, 0x13, 0x09, 0x9e, 0xf1, 0xfb, 0xe1, 0x6b, 0x9b, 0x48, 0x5d, 0x8e,
0xcb, 0xc0, 0xb3, 0x0f, 0x48, 0x67, 0x8e, 0x53, 0xd7, 0x51, 0x8e, 0xf4, 0x44, 0x1d, 0xcf, 0xc4,
0x03, 0x0d, 0x64, 0x68, 0xb9, 0x62, 0x2b, 0x0b, 0x31, 0xf1, 0xc8, 0x22, 0xce, 0xbe, 0xc5, 0xa6,
0x06, 0x4f, 0x43, 0x9a, 0x1b, 0xa5, 0xfc, 0xa6, 0xac, 0xe4, 0x94, 0x5e, 0x4b, 0x80, 0x65, 0xfe,
0xb4, 0xeb, 0xd4, 0x4d, 0x0e, 0x66, 0x01, 0x1d, 0x2b, 0x31, 0x7d, 0xfc, 0x3a, 0xb2, 0x63, 0x45,
0x5b, 0x3a, 0x64, 0xd1, 0xc8, 0x25, 0x1a, 0xa6, 0x6c, 0x96, 0xa5, 0x9c, 0x20, 0xfc, 0xf8, 0x8a,
0x0d, 0x5b, 0x83, 0x19, 0xd4, 0xde, 0x01, 0xc3, 0x22, 0x06, 0x6c, 0x0b, 0x0a, 0x17, 0x9c, 0x77,
0x1f, 0xc0, 0x53, 0x07, 0xc7, 0x6f, 0xe3, 0xdf, 0x61, 0x6e, 0x21, 0x0e, 0x8f, 0x26, 0x3b, 0x89,
0x3b, 0x7b, 0x11, 0x7a, 0xf2, 0x88, 0x29, 0x98, 0xff, 0xec, 0x4b, 0x95, 0xee, 0x8b, 0xc7, 0xde,
0x60, 0x0a, 0x49, 0x0e, 0x4f, 0xa3, 0x91, 0xa9, 0xfc, 0x97, 0x4a, 0x34, 0xe8, 0x00, 0x8f, 0x38,
0xa6, 0x91, 0xe5, 0xde, 0xfe, 0x2d, 0x20, 0xde, 0xd8, 0x9b, 0x6a, 0x97, 0x14, 0x3a, 0xaf, 0x2f,
0x47, 0x8a, 0x66, 0x22, 0x03, 0x68, 0x4b, 0x9b, 0xe4, 0xbd, 0x98, 0x2e, 0x5f, 0x21, 0x63, 0x5a,
0x9a, 0x70, 0x27, 0x41, 0x46, 0x51, 0x27, 0xbb, 0xa1, 0xb6, 0xd5, 0x2d, 0xdf, 0x09, 0x64, 0xd5,
0xdb, 0x0c, 0x2f, 0x4c, 0x00, 0x55, 0x45, 0xd1, 0x12, 0xd7, 0xdb, 0x81, 0x09, 0x40, 0x59, 0xba,
0x93, 0xe8, 0xfc, 0x0c, 0x1a, 0x9e, 0x00, 0xd9, 0xf7, 0xc5, 0x68, 0x23, 0x16, 0x10, 0x51, 0xba,
0xb0, 0x0c, 0x67, 0x56, 0x6d, 0xd4, 0x81, 0x88, 0xa1, 0x6f, 0xcc, 0x9c, 0x54, 0x3b, 0x5a, 0xc0,
0x27, 0x90, 0xaa, 0xf1, 0x10, 0xf7, 0x28, 0x56, 0xec, 0x49, 0x05, 0x41, 0x88, 0x24, 0x9a, 0x8b,
0x62, 0x5f, 0xe1, 0x9c, 0xa6, 0xd7, 0x23, 0x08, 0x80, 0xf5, 0x85, 0x4d, 0xce, 0xa4, 0xf5, 0x11,
0xc0, 0x4b, 0xd3, 0x64, 0xe4, 0x2e, 0x08, 0x3b, 0xea, 0x33, 0x46, 0xaf, 0x92, 0xec, 0x61, 0xc8,
0x14, 0xee, 0x6f, 0x90, 0x5a, 0xe8, 0x3e, 0xcb, 0xe1, 0x41, 0xd8, 0x5f, 0xab, 0xac, 0x5b, 0xe7,
0x61, 0x09, 0x92, 0x62, 0xc8, 0x42, 0x12, 0x3f, 0x9d, 0x17, 0x11, 0x17, 0x1d, 0x89, 0x1c, 0x59,
0x55, 0x42, 0xec, 0x37, 0x7b, 0xdc, 0x30, 0xe7, 0x01, 0x8f, 0x76, 0x6c, 0xda, 0xb0, 0x45, 0x50,
0x02, 0x8d, 0x27, 0xea, 0x55, 0x04, 0x11, 0xf6, 0xf3, 0x3f, 0xca, 0xed, 0xef, 0x8c, 0xf6, 0xb6,
0xd5, 0x83, 0x46, 0xa1, 0x56, 0xd9, 0xc5, 0xa5, 0x65, 0x45, 0x9c, 0x50, 0x3e, 0x9e, 0xc6, 0xd0,
0x83, 0x8d, 0x13, 0xd0, 0x6a, 0x21, 0x30, 0x44, 0x70, 0x6a, 0x95, 0xf2, 0x48, 0x18, 0x84, 0xe5,
0x60, 0xa4, 0xb3, 0xe5, 0x74, 0xe0, 0x8a, 0x47, 0x58, 0x82, 0x89, 0xb7, 0x16, 0xc0, 0x1a, 0x0f,
0x0f, 0x35, 0x56, 0xa3, 0x0c, 0xdb, 0x12, 0xc0, 0x02, 0x8f, 0x1a, 0x72, 0xd1, 0x73, 0xbf, 0xf0,
0x67, 0x94, 0xaa, 0xc8, 0x73, 0x5b, 0x95, 0x61, 0x5a, 0xca, 0x41, 0xf5, 0xe9, 0xc6, 0x38, 0x21,
0x67, 0x1b, 0xe7, 0xc5, 0x7b, 0x0d, 0x06, 0x60, 0x6d, 0x31, 0x40, 0x6e, 0xa5, 0xd6, 0xfa, 0xe1,
0xd1, 0x85, 0x8e, 0x52, 0x2d, 0xf5, 0x06, 0x90, 0xf8, 0x55, 0xf9, 0x1e, 0x8e, 0x7f, 0xd5, 0xc7,
0x32, 0x0a, 0x93, 0xb8, 0xe0, 0xe3, 0x1c, 0xe1, 0xa0, 0xfe, 0xa6, 0x11, 0x4b, 0x08, 0x14, 0x47,
0x10, 0x56, 0xc5, 0x62, 0x38, 0x22, 0x12, 0xfc, 0x2b, 0x9a, 0x9e, 0xf2, 0x19, 0xe7, 0xa4, 0xa2,
0x0f, 0xb8, 0x32, 0xeb, 0x42, 0x77, 0x3c, 0xb2, 0x41, 0xbf, 0x3c, 0x05, 0x19, 0xf3, 0x6a, 0x50,
0x74, 0x41, 0x0e, 0x02, 0xab, 0x1a, 0xc7, 0x69, 0x04, 0x76, 0xb4, 0xb2, 0x45, 0x6f, 0x05, 0x92,
0x77, 0x83, 0x9b, 0xc2, 0x4b, 0xeb, 0x30, 0xf1, 0x8e, 0xf0, 0x2c, 0xa8, 0x52, 0xdf, 0xcf, 0x0f,
0xd4, 0x63, 0xb7, 0x55, 0x9e, 0x8d, 0xd9, 0xc0, 0xef, 0x02, 0xaa, 0x74, 0x76, 0x43, 0x4b, 0x60,
0x53, 0x04, 0xce, 0x21, 0xa5, 0xa0, 0x1c, 0x48, 0xca, 0x64, 0xe3, 0xc7, 0x18, 0xc2, 0x67, 0x95,
0xba, 0x85, 0xe9, 0x87, 0xee, 0xd8, 0x03, 0x07, 0xc4, 0xe7, 0x6a, 0xf8, 0x83, 0xb4, 0xbc, 0xb6,
0x82, 0x9e, 0xc9, 0x1e, 0xe3, 0xa9, 0x36, 0x22, 0x77, 0xc4, 0x98, 0x3c, 0x50, 0xfb, 0x6e, 0xd9,
0x42, 0x2a, 0x48, 0xb6, 0xe8, 0x33, 0x7c, 0xc4, 0x30, 0xd7, 0xc0, 0x59, 0x6d, 0x5c, 0x74, 0x93,
0x8b, 0x70, 0x28, 0x25, 0xcc, 0x52, 0x3d, 0xb1, 0xa8, 0xa6, 0x60, 0x39, 0x3a, 0x2d, 0xf6, 0x53,
0x0e, 0x34, 0x28, 0xe1, 0x2b, 0x89, 0x08, 0x27, 0x3a, 0x28, 0x51, 0xef, 0x20, 0xf9, 0x9c, 0x36,
0xb1, 0x2c, 0xeb, 0x6a, 0xeb, 0x60, 0x08, 0x0b, 0x25, 0xac, 0x34, 0x4d, 0x21, 0xea, 0x2d, 0x27,
0x98, 0x62, 0x14, 0x68, 0x41, 0x94, 0x66, 0x20, 0x0d, 0x52, 0x32, 0x0d, 0x71, 0x68, 0x1a, 0x44,
0x13, 0x47, 0xda, 0x22, 0xd6, 0xf5, 0x3a, 0x3a, 0x05, 0x9f, 0xfc, 0x62, 0xbc, 0x76, 0xd9, 0x37,
0x7f, 0x73, 0x2b, 0x8d, 0x83, 0xa5, 0x81, 0xf3, 0x98, 0x95, 0x56, 0x99, 0x19, 0x73, 0xd7, 0x24,
0xf7, 0x62, 0x79, 0xf5, 0x7b, 0x2e, 0x05, 0x41, 0x65, 0x72, 0xfb, 0x6a, 0xd1, 0xd2, 0xe9, 0x9c,
0x08, 0x53, 0x8d, 0x08, 0x84, 0x27, 0xe7, 0x6a, 0xda, 0x99, 0xf2, 0xbf, 0x13, 0xb4, 0x1f, 0xa8,
0x5f, 0x21, 0x40, 0xc0, 0x64, 0xb4, 0x0a, 0x6a, 0x2f, 0x88, 0x09, 0xff, 0x82, 0x19, 0x9b, 0xec,
0x4f, 0xa0, 0xdf, 0x73, 0xb2, 0x41, 0x00, 0x09, 0xa6, 0xff, 0x38, 0x58, 0x68, 0x44, 0xe0, 0x67,
0xda, 0xd7, 0x57, 0xd9, 0x9c, 0xf6, 0x0a, 0xd6, 0x9f, 0x6a, 0x3b, 0x98, 0x59, 0xdd, 0xdf, 0xe2,
0x10, 0x56, 0xd5, 0xf3, 0x51, 0x20, 0x7e, 0xc5, 0x78, 0x0d, 0x18, 0xcf, 0x8f, 0x0c, 0x01, 0xf2,
0xaa, 0xa2, 0x05, 0x9c, 0x65, 0x8e, 0x10, 0x86, 0x0a, 0x2c, 0x6c, 0x45, 0x7b, 0x6d, 0x03, 0xdf,
0x57, 0xd3, 0x36, 0x21, 0xee, 0xd1, 0xd1, 0x81, 0x5e, 0x27, 0x86, 0xbc, 0x76, 0x70, 0x85, 0xe0,
0x95, 0x46, 0xc7, 0xc8, 0x8b, 0x95, 0x28, 0x39, 0xc8, 0x55, 0xf9, 0x61, 0x7c, 0xd5, 0x37, 0x48,
0xad, 0x68, 0x1c, 0x4e, 0x84, 0x38, 0x48, 0x34, 0xad, 0x24, 0xab, 0xfa, 0x1d, 0x6f, 0xda, 0x2e,
0x41, 0xc4, 0xcc, 0x5c, 0x3b, 0xaf, 0x32, 0xb7, 0x13, 0x3d, 0x0a, 0x44, 0x83, 0x01, 0x78, 0x07,
0xfe, 0x6f, 0xae, 0xfe, 0x11, 0xa4, 0x29, 0x54, 0x7d, 0x83, 0x8a, 0xd4, 0xed, 0xba, 0x93, 0x13,
0x60, 0x3a, 0xd4, 0xa9, 0xa4, 0x63, 0x3e, 0x06, 0x81, 0xa0, 0x31, 0x8b, 0xc2, 0x25, 0x70, 0xaa,
0xc8, 0x41, 0xcd, 0xce, 0x55, 0x9b, 0x6a, 0x6f, 0x75, 0x01, 0xcb, 0xd4, 0xde, 0x6b, 0xcc, 0x38,
0xe5, 0x14, 0x18, 0xe4, 0x53, 0xac, 0x26, 0x08, 0x1e, 0x07, 0x78, 0x3c, 0xd4, 0x17, 0xdd, 0x40,
0x50, 0x3c, 0x94, 0x46, 0x6b, 0xc4, 0xf3, 0x7b, 0xdd, 0x2d, 0xe3, 0xe9, 0x0e, 0x23, 0x44, 0x39,
0xbc, 0x97, 0xa4, 0xa0, 0xda, 0x84, 0x20, 0xec, 0x94, 0xce, 0x0e, 0x04, 0xd4, 0xb0, 0x61, 0xb4,
0x4f, 0xa7, 0x08, 0x71, 0xd6, 0x8e, 0x48, 0x6f, 0x88, 0xd4, 0x19, 0x60, 0x0a, 0x91, 0x77, 0x99,
0xbb, 0xce, 0x30, 0xb8, 0x36, 0x1b, 0x0c, 0x13, 0x0e, 0x2d, 0x79, 0xc6, 0xe6, 0x79, 0xa4, 0xd7,
0x4d, 0xea, 0x8e, 0xa2, 0xc1, 0x40, 0xbd, 0x2b, 0xde, 0x04, 0x78, 0xa6, 0x59, 0x8a, 0x10, 0xac,
0xc3, 0xf6, 0x53, 0x71, 0xfe, 0x79, 0x0f, 0x79, 0x37, 0xd5, 0xbf, 0xdd, 0xab, 0xad, 0xac, 0x9e,
0x12, 0xac, 0xbd, 0xd5, 0x06, 0x26, 0x35, 0xab, 0xb1, 0x0d, 0x26, 0x5e, 0x87, 0x3a, 0xa0, 0x07,
0xb0, 0xb5, 0x72, 0xc8, 0xad, 0x43, 0x2b, 0x87, 0xb1, 0x91, 0xf4, 0x1c, 0x42, 0xd8, 0x51, 0xa6,
0x6e, 0xf6, 0xa7, 0xff, 0x53, 0xd8, 0xa5, 0x11, 0xce, 0x2c, 0x01, 0xf4, 0x1d, 0x22, 0x23, 0x4d,
0xcb, 0x27, 0x61, 0x06, 0xdb, 0x9d, 0x3c, 0x99, 0x0c, 0x5e, 0x1f, 0xca, 0x13, 0xde, 0x97, 0xdf,
0xbd, 0x28, 0x72, 0xdc, 0x2d, 0x69, 0x9c, 0x3b, 0x6a, 0xa2, 0x0c, 0x5c, 0xf6, 0xfa, 0x2f, 0xc5,
0xe6, 0xd6, 0x6c, 0xcd, 0x1a, 0xfe, 0x39, 0xed, 0x31, 0x72, 0x26, 0xbb, 0xa5, 0xfd, 0x2a, 0x97,
0x0a, 0xdb, 0xa5, 0x54, 0xb1, 0x44, 0x00, 0x3f, 0x9b, 0x79, 0xa2, 0xda, 0xc3, 0xc1, 0x4d, 0xdf,
0x70, 0x43, 0xc9, 0x0b, 0xdb, 0x4a, 0x24, 0xf7, 0xba, 0x4b, 0xac, 0x46, 0x78, 0x42, 0x3b, 0x66,
0xe3, 0x2d, 0x3a, 0x42, 0x9a, 0x84, 0x3c, 0x5b, 0x36, 0x6f, 0x66, 0x14, 0x58, 0xec, 0x60, 0x4b,
0x67, 0xfb, 0x6a, 0x34, 0x2c, 0x6a, 0x15, 0xb7, 0xc6, 0x7b, 0x0a, 0xe3, 0x5b, 0x9a, 0xcd, 0x84,
0x2e, 0xab, 0x18, 0x8f, 0x08, 0x07, 0xe2, 0x25, 0xb6, 0x3d, 0x21, 0x0f, 0x59, 0xb7, 0x92, 0xaa,
0x4f, 0x79, 0xcd, 0x60, 0x7e, 0x0a, 0x0a, 0x85, 0xff, 0x4d, 0x0d, 0x01, 0x0f, 0xe2, 0xcf, 0x97,
0xee, 0x13, 0x75, 0xfc, 0x91, 0x80, 0x0a, 0x96, 0x86, 0x6c, 0x88, 0x09, 0xeb, 0x5c, 0x71, 0x6b,
0x24, 0x51, 0xec, 0xd3, 0xa4, 0x83, 0x14, 0x47, 0x8b, 0xa0, 0x21, 0x95, 0x38, 0xf3, 0x0f, 0x56,
0x81, 0xb5, 0x93, 0xfe, 0xe1, 0x63, 0x8f, 0x88, 0x6b, 0x85, 0x38, 0xce, 0x3c, 0x5c, 0xea, 0x46,
0x73, 0xb8, 0x00, 0xd9, 0x5d, 0xa8, 0x3f, 0x76, 0xfd, 0xdc, 0x9e, 0x78, 0x90, 0x83, 0xd2, 0x29,
0xb2, 0xbd, 0x86, 0x85, 0x58, 0x65, 0x33, 0xb7, 0x01, 0xab, 0x68, 0x84, 0xc5, 0xab, 0x7a, 0x77,
0x8e, 0x4b, 0xf2, 0x27, 0x3d, 0x44, 0x3e, 0xa4, 0x4e, 0x19, 0x20, 0xde, 0xaa, 0xe2, 0x28, 0xf2,
0x85, 0x86, 0xa6, 0x92, 0x2a, 0xce, 0x88, 0xae, 0x9f, 0xfe, 0xff, 0xac, 0x1a, 0xbf, 0x78, 0x69,
0xe4, 0x98, 0xb5, 0xa1, 0x54, 0x97, 0x05, 0x25, 0x70, 0x3e, 0x67, 0x00, 0x96, 0xc5, 0xe0, 0x39,
0x9c, 0x95, 0x92, 0x7d, 0xd7, 0x23, 0x83, 0xb9, 0xe2, 0xf3, 0xbb, 0x65, 0x98, 0xcc, 0xda, 0x47,
0xf2, 0xd3, 0x59, 0x43, 0x34, 0x92, 0x32, 0x03, 0x70, 0x5f, 0x5f, 0xcd, 0x8c, 0xba, 0xc6, 0x97,
0x48, 0x20, 0x18, 0x8e, 0xe2, 0xfc, 0x96, 0xc9, 0x6a, 0x4a, 0xcf, 0x4c, 0xf8, 0x68, 0x55, 0x3c,
0x80, 0x8f, 0x69, 0x41, 0xe2, 0xf1, 0x08, 0x90, 0xe4, 0xa0, 0xf4, 0x63, 0x04, 0x4f, 0x64, 0x16,
0xfc, 0xd5, 0x32, 0xf0, 0x87, 0x57, 0x60, 0x28, 0x85, 0xfc, 0x1f, 0x8c, 0x42, 0xec, 0xc1, 0x41,
0x93, 0x32, 0x0b, 0x4b, 0x8e, 0xbc, 0x18, 0xc7, 0x15, 0xd4, 0xe1, 0x99, 0x3f, 0x69, 0x74, 0x05,
0x44, 0xd1, 0xd7, 0x83, 0xc0, 0x01, 0x00, 0x34, 0x0e, 0x44, 0x56, 0xf5, 0xe2, 0x6c, 0xfe, 0x26,
0xfb, 0x10, 0x2a, 0xfc, 0xea, 0xb6, 0x1f, 0xef, 0x62, 0xbe, 0x39, 0x0d, 0xa2, 0xfc, 0xea, 0x72,
0x2d, 0xa6, 0x1e, 0x5c, 0x25, 0x0f, 0xcc, 0xe6, 0xad, 0xc5, 0xe6, 0x53, 0xc9, 0x1c, 0x46, 0x4a,
0x89, 0xaf, 0x58, 0xf9, 0xa3, 0x09, 0x0b, 0x6e, 0xdf, 0x29, 0xcd, 0xfc, 0x4c, 0xb8, 0x9b, 0x3e,
0x0e, 0x5b, 0xdb, 0x4e, 0x4b, 0x82, 0x36, 0x7b, 0x01, 0xe9, 0x83, 0x75, 0x5a, 0xfc, 0xe5, 0x90,
0xc3, 0xe9, 0xc2, 0x6f, 0x15, 0x8f, 0x01, 0xc5, 0x8a, 0x0a, 0xea, 0x73, 0x02, 0xc0, 0xa4, 0x7a,
0x18, 0x32, 0x30, 0xb9, 0x05, 0xb7, 0x03, 0x02, 0xef, 0xac, 0x2f, 0xdc, 0x5c, 0x40, 0x2a, 0x56,
0x0b, 0xe5, 0xe3, 0x70, 0x85, 0x88, 0x1d, 0xd9, 0x7d, 0xa0, 0x40, 0x8d, 0x37, 0x85, 0xdf, 0xd0,
0xca, 0xd6, 0x1f, 0xe7, 0x67, 0xfa, 0xc5, 0xb8, 0x92, 0xdd, 0x4f, 0x26, 0x4d, 0x77, 0xbe, 0x51,
0xa8, 0x0b, 0x1d, 0x2c, 0xb4, 0x52, 0x33, 0x8d, 0x95, 0xaf, 0xf1, 0xbd, 0x6e, 0x91, 0xde, 0xac,
0xf6, 0xba, 0x0a, 0x5c, 0x9b, 0x67, 0x20, 0x21, 0xd1, 0x33, 0xf7, 0x0f, 0xf4, 0xb1, 0x2a, 0x6b,
0x5b, 0x30, 0x31, 0x01, 0x1d, 0xb3, 0x10, 0xec, 0xef, 0x05, 0x24, 0x72, 0xd6, 0xb5, 0x14, 0x48,
0xef, 0xc7, 0x93, 0xf8, 0xf4, 0x76, 0x9a, 0x24, 0x01, 0xe3, 0x26, 0xca, 0x30, 0xa0, 0xc5, 0x1c,
0x7e, 0xc2, 0x19, 0x7a, 0x87, 0xf9, 0x1d, 0xd3, 0xa4, 0xae, 0x81, 0xb3, 0x06, 0x2f, 0xbd, 0xc3,
0xd5, 0xb6, 0xd7, 0xa7, 0x82, 0x8d, 0xab, 0x0e, 0x34, 0x9e, 0xe2, 0x37, 0x2b, 0x0b, 0x49, 0x94,
0x1f, 0x25, 0x33, 0x27, 0xdf, 0x15, 0x3e, 0x2c, 0x90, 0x60, 0x19, 0x28, 0xcc, 0xd1, 0x0f, 0xc8,
0x67, 0x5e, 0x5c, 0x63, 0x42, 0x14, 0x7c, 0xfb, 0x22, 0x21, 0x43, 0x7f, 0x31, 0x3a, 0xa5, 0xe4,
0x87, 0x75, 0xfe, 0x08, 0x45, 0xa7, 0x32, 0xd9, 0x5f, 0x54, 0x93, 0x64, 0xce, 0xaf, 0xca, 0x4a,
0x1e, 0xd9, 0xde, 0x5a, 0x64, 0x9f, 0x77, 0x93, 0x49, 0x54, 0x7a, 0xa9, 0x96, 0xc0, 0x0e, 0xf4,
0x0c, 0xc2, 0x43, 0x33, 0x42, 0x92, 0x3f, 0x11, 0x96, 0x8b, 0x50, 0x11, 0xa6, 0x9c, 0xe7, 0x38,
0x40, 0xaa, 0x19, 0x56, 0x6e, 0x6e, 0x6a, 0xe6, 0x9f, 0xa4, 0xbe, 0x10, 0xc5, 0xf8, 0x72, 0xe0,
0xaf, 0xec, 0x51, 0xa0, 0xd9, 0x28, 0x08, 0xe9, 0x16, 0x1c, 0x50, 0x97, 0xe7, 0x18, 0x38, 0xd0,
0x05, 0x35, 0x49, 0x72, 0xfa, 0xe4, 0x7b, 0x6e, 0x52, 0x92, 0x41, 0x1d, 0xcd, 0x08, 0x79, 0xd7,
0x75, 0xd8, 0x9e, 0x02, 0x70, 0xaf, 0x09, 0x6c, 0xac, 0x1c, 0x33, 0xa1, 0x7e, 0x56, 0xcd, 0xad,
0x4e, 0x4d, 0xc8, 0xae, 0xa4, 0xac, 0xbf, 0x29, 0x52, 0xa0, 0x1e, 0x29, 0x76, 0x08, 0xc1, 0x2d,
0x7f, 0xcf, 0x2a, 0x63, 0xde, 0xd0, 0x38, 0xa0, 0xf8, 0xf5, 0xc0, 0x0e, 0x1b, 0xce, 0x32, 0xe4,
0x67, 0xa6, 0x9d, 0xf1, 0xb5, 0x02, 0x91, 0xb0, 0x4c, 0xbf, 0xf9, 0x38, 0x33, 0x47, 0xf8, 0x82,
0x8f, 0x17, 0xc0, 0xd8, 0xa6, 0xe4, 0x0c, 0x85, 0xa7, 0xc2, 0x81, 0xf3, 0x99, 0x6e, 0x8c, 0x4b,
0x40, 0x9e, 0x7c, 0x31, 0x13, 0x03, 0x36, 0x33, 0x0c, 0x95, 0xcd, 0xe3, 0x35, 0x4c, 0x73, 0x83,
0x3d, 0x80, 0xaa, 0xa7, 0xbb, 0x15, 0x1b, 0x7e, 0xbd, 0x23, 0x31, 0xe7, 0x50, 0x51, 0xe0, 0x51,
0xaf, 0xf1, 0x74, 0x2d, 0x4f, 0xa7, 0x6b, 0x81, 0x5a, 0x07, 0xd6, 0x0f, 0xb4, 0xdf, 0x95, 0x5d,
0xf8, 0x7c, 0x47, 0xea, 0x0c, 0x90, 0x3d, 0x73, 0x2d, 0x05, 0x07, 0x50, 0xc9, 0x92, 0x6c, 0xdf,
0xd3, 0xbc, 0xcc, 0xb0, 0x60, 0xfe, 0xf4, 0x6b, 0xc9, 0x9c, 0x1d, 0x99, 0x1f, 0x45, 0x66, 0xe9,
0x66, 0xb3, 0xd8, 0x3f, 0x87, 0x32, 0x09, 0x0d, 0x8e, 0xe4, 0xb6, 0x68, 0xd8, 0x5c, 0x13, 0x58,
0x16, 0x27, 0xa3, 0x9a, 0x51, 0x3a, 0x8a, 0xac, 0x03, 0x7e, 0x65, 0x32, 0x0e, 0xff, 0xb6, 0x2b,
0x8f, 0xe1, 0x65, 0x03, 0x1d, 0x84, 0x31, 0x7b, 0x08, 0x29, 0x55, 0xa7, 0x1f, 0x1b, 0x95, 0x1d,
0x5e, 0x68, 0x8f, 0x6f, 0xc7, 0x52, 0x55, 0x09, 0x8a, 0x8e, 0xff, 0xd3, 0x5b, 0x41, 0x60, 0xb8,
0x3a, 0x05, 0x5b, 0xb9, 0xe0, 0xbe, 0x0f, 0xd8, 0xf7, 0x01, 0xb5, 0xeb, 0xc9, 0xed, 0x8e, 0xe4,
0x85, 0x69, 0x18, 0xdd, 0xa1, 0x27, 0xf0, 0x9a, 0x13, 0x51, 0xe7, 0x22, 0xdf, 0x04, 0xcd, 0xc3,
0xd9, 0xa8, 0x73, 0xdb, 0xe8, 0xb7, 0x39, 0x66, 0x9b, 0x36, 0x15, 0xad, 0x14, 0xad, 0x9d, 0xf0,
0x64, 0x69, 0xa3, 0x6a, 0xbb, 0x59, 0xfb, 0xce, 0x00, 0xac, 0x23, 0xb4, 0x7f, 0x3a, 0xa2, 0xf9,
0x55, 0x4b, 0x7b, 0x0f, 0x9d, 0x5a, 0x2b, 0xc7, 0x5e, 0xb7, 0xfb, 0x21, 0x10, 0xf4, 0x0d, 0x2e,
0x62, 0xca, 0x7b, 0x30, 0x0f, 0xdf, 0xa7, 0xf3, 0xd2, 0xf4, 0x6c, 0xd8, 0x14, 0x76, 0x02, 0x3b,
0x43, 0x59, 0xd7, 0xa9, 0x19, 0x81, 0x1d, 0x65, 0xe8, 0xc3, 0x9b, 0x69, 0xf2, 0xd4, 0x73, 0xf3,
0xf8, 0x84, 0xaa, 0xf9, 0x1e, 0xa9, 0x1e, 0xcd, 0x84, 0xc4, 0x45, 0xa6, 0x34, 0xf2, 0x8a, 0x93,
0x3b, 0xb6, 0x2b, 0xc8, 0x49, 0x48, 0x1c, 0xd9, 0x70, 0x8e, 0xf2, 0x07, 0x2b, 0xf5, 0x22, 0x63,
0x3f, 0x0c, 0x2b, 0xb7, 0xd6, 0x8a, 0x6f, 0x64, 0x41, 0x33, 0x7a, 0xd7, 0x02, 0x13, 0x50, 0xec,
0x36, 0xa9, 0x6a, 0x31, 0x26, 0xe3, 0x00, 0xa7, 0x67, 0xbb, 0xac, 0x22, 0xee, 0xbc, 0x33, 0xb0,
0x4f, 0xdf, 0x2b, 0x36, 0xdf, 0x8f, 0x1a, 0x6a, 0xc5, 0x21, 0x78, 0xd0, 0x8c, 0x5c, 0x71, 0xe5,
0xde, 0xa3, 0x85, 0x39, 0x5b, 0x62, 0x3f, 0xea, 0xae, 0x03, 0x14, 0x67, 0x4e, 0xc7, 0x9b, 0x4a,
0x5d, 0x26, 0xca, 0x1f, 0xdf, 0xa0, 0x8f, 0x18, 0x2b, 0xf4, 0x2d, 0x4a, 0xd3, 0x9c, 0x07, 0x7c,
0xb7, 0xa6, 0x1e, 0xcb, 0xb6, 0x48, 0x02, 0x79, 0x6a, 0xf3, 0x67, 0xf4, 0xe2, 0xe7, 0x5f, 0x0e,
0x3a, 0x27, 0xb5, 0xff, 0xc4, 0xef, 0x5b, 0xf6, 0x02, 0x64, 0x73, 0x94, 0x8c, 0x50, 0x29, 0x86,
0xcc, 0x02, 0x6e, 0xc4, 0x70, 0xa8, 0x36, 0xc9, 0x3f, 0x32, 0xc3, 0x1d, 0x21, 0x54, 0x64, 0x9d,
0xdc, 0x71, 0x30, 0xd3, 0x97, 0x4c, 0x4c, 0xd2, 0xfa, 0xb9, 0x80, 0x11, 0x12, 0x47, 0xa3, 0x5d,
0x85, 0x61, 0xbe, 0x6c, 0x8c, 0xdc, 0x12, 0x59, 0x1d, 0xbb, 0x81, 0xe6, 0x5e, 0x99, 0xf9, 0x78,
0xce, 0xe1, 0x8b, 0x4f, 0x6a, 0x01, 0xce, 0xb4, 0xc1, 0xb0, 0xf8, 0x50, 0x4c, 0x4d, 0x48, 0x1e,
0xea, 0x94, 0x6f, 0xab, 0x26, 0xf8, 0x0c, 0x74, 0xd2, 0xd3, 0x75, 0x6a, 0x83, 0x96, 0xfd, 0xb4,
0x5e, 0xfb, 0x06, 0x63, 0xf7, 0x1c, 0xa9, 0x15, 0xc9, 0x72, 0xc2, 0xf7, 0x36, 0x03, 0x66, 0xca,
0x66, 0x3b, 0x8e, 0x39, 0x59, 0x51, 0x27, 0x87, 0xe7, 0xbb, 0x98, 0xc2, 0xb0, 0xe6, 0x1c, 0xb9,
0x05, 0xb6, 0xde, 0x55, 0xbb, 0xb8, 0xff, 0x42, 0x79, 0xf1, 0xa3, 0x09, 0xa6, 0xe2, 0xc9, 0xa5,
0x58, 0x42, 0x9a, 0xdb, 0x08, 0xd3, 0x29, 0x17, 0xc2, 0x91, 0x10, 0xdf, 0x3a, 0xb3, 0x41, 0x3a,
0x27, 0x73, 0xf7, 0xc7, 0xd9, 0xa4, 0x58, 0xef, 0xd2, 0xcd, 0x2e, 0xe1, 0x42, 0xd4, 0x05, 0x7e,
0x96, 0x8b, 0x26, 0x99, 0x7c, 0xfc, 0x34, 0x33, 0x18, 0x3b, 0x29, 0x71, 0x3f, 0x39, 0x7a, 0x4c,
0xf0, 0x01, 0x20, 0xe0, 0x44, 0x5a, 0x88, 0xb6, 0xcc, 0xb6, 0xcd, 0x96, 0x8a, 0x1f, 0x9e, 0xcb,
0x3c, 0x7f, 0x7e, 0x1a, 0x2c, 0xbf, 0x2a, 0xda, 0xd1, 0x91, 0x53, 0x20, 0x00, 0x10, 0xb4, 0x83,
0x78, 0x8f, 0xeb, 0xc1, 0x0f, 0xe2, 0x10, 0x14, 0x5d, 0x27, 0x3a, 0x3d, 0x5e, 0x3e, 0x3d, 0xe5,
0x7c, 0x84, 0xaa, 0x7c, 0x6a, 0xa8, 0x3d, 0x86, 0x0a, 0x79, 0xcc, 0xa1, 0x09, 0x2e, 0x96, 0x41,
0x41, 0xc5, 0xce, 0x3e, 0x9d, 0x93, 0x20, 0xb0, 0x7a, 0x53, 0xfd, 0x10, 0xba, 0x2f, 0xe4, 0x0f,
0xfd, 0xbf, 0x55, 0x23, 0x2b, 0x3a, 0x2d, 0xaa, 0x7e, 0xf1, 0xbc, 0x6d, 0x93, 0x57, 0xc7, 0x1b,
0xd4, 0x28, 0x03, 0x8f, 0xae, 0x3c, 0x90, 0xb2, 0xb1, 0xff, 0x2c, 0x40, 0xa2, 0xd4, 0x0a, 0x55,
0xde, 0xeb, 0xf7, 0x85, 0xad, 0x6e, 0x13, 0x6e, 0x55, 0x53, 0x06, 0xf1, 0x37, 0x2e, 0x50, 0x78,
0xe0, 0x6f, 0x27, 0xc1, 0xbe, 0xc5, 0x81, 0xb3, 0x52, 0xd5, 0xc0, 0xe9, 0x98, 0xf5, 0x74, 0x5b,
0x17, 0xdd, 0x84, 0xbc, 0xed, 0x06, 0x2c, 0xa3, 0xa4, 0x48, 0xc9, 0xf1, 0xa1, 0x9d, 0xf2, 0x48,
0x23, 0x59, 0x09, 0xd5, 0x88, 0xf1, 0x79, 0xa2, 0x03, 0xe6, 0x8d, 0xe6, 0x3a, 0xb9, 0xd3, 0xeb,
0xcb, 0xa6, 0x13, 0xd0, 0xef, 0xe3, 0x11, 0x71, 0x0e, 0x1b, 0xf3, 0xd3, 0xa9, 0xc3, 0xfb, 0xc6,
0xbd, 0xf8, 0xd8, 0x99, 0x41, 0x81, 0x6f, 0xe8, 0x09, 0x7d, 0x0a, 0xcd, 0x91, 0xc0, 0xa2, 0x38,
0x42, 0x5c, 0x53, 0x19, 0x02, 0x5e, 0x21, 0xab, 0xa1, 0xf1, 0xe8, 0x0d, 0xf0, 0x6d, 0x65, 0xab,
0x4d, 0x39, 0xa4, 0x05, 0xda, 0x30, 0xc4, 0x4c, 0x94, 0x3a, 0xd8, 0x49, 0x00, 0x39, 0x85, 0xe4,
0x91, 0x55, 0xf9, 0x40, 0x08, 0x22, 0x04, 0x1a, 0xa5, 0xe2, 0x48, 0x3d, 0x10, 0x76, 0xb4, 0x25,
0x7f, 0x12, 0xb2, 0xfb, 0xda, 0xa5, 0xa9, 0x18, 0x28, 0x91, 0x1d, 0x86, 0x0f, 0xda, 0x10, 0x53,
0xa9, 0x99, 0xc1, 0xc8, 0x02, 0x41, 0x3a, 0x42, 0xdc, 0x55, 0x21, 0xca, 0x6e, 0x8a, 0x75, 0x5b,
0xe1, 0x26, 0xdf, 0x16, 0x48, 0x14, 0xc7, 0x01, 0xad, 0x2f, 0x75, 0x49, 0x64, 0x44, 0xff, 0x5a,
0xc6, 0x70, 0x89, 0x10, 0x79, 0xac, 0x0e, 0x2f, 0xaf, 0x6d, 0x57, 0xf5, 0x59, 0x6c, 0x79, 0x1b,
0x9d, 0x4c, 0x39, 0xb3, 0xa5, 0xbf, 0xb6, 0xe0, 0x78, 0x76, 0x81, 0x4f, 0xde, 0xea, 0xa0, 0xdd,
0x63, 0x25, 0x7c, 0x4f, 0x1d, 0x53, 0x2d, 0x2d, 0x4d, 0x61, 0x72, 0x86, 0x07, 0x6e, 0xd3, 0x23,
0xe3, 0x79, 0xc4, 0x27, 0xc5, 0xfe, 0x5d, 0x05, 0xb1, 0xe3, 0x45, 0x1b, 0x6c, 0xd7, 0x1e, 0x8f,
0x62, 0xc2, 0x85, 0x0d, 0x2c, 0xbe, 0x25, 0xc5, 0x38, 0xe9, 0xa2, 0x80, 0x34, 0x4f, 0x4e, 0x30,
0xff, 0xaf, 0x16, 0x4c, 0x8b, 0xd0, 0xb1, 0x0e, 0x3f, 0x4e, 0xf9, 0x0d, 0x4e, 0x1d, 0x95, 0x49,
0x66, 0xcf, 0xa0, 0x8f, 0xa3, 0xf6, 0x35, 0xfa, 0x88, 0xa1, 0xf9, 0xfc, 0x34, 0x71, 0xd6, 0xfe,
0xbc, 0x21, 0x6f, 0xbe, 0xc4, 0xca, 0xd7, 0x85, 0xa3, 0x65, 0x10, 0x5c, 0x46, 0xc9, 0xbd, 0xce,
0xbf, 0xcc, 0x4c, 0x3c, 0x7e, 0x2a, 0x28, 0x09, 0x6a, 0x73, 0x16, 0x35, 0xf7, 0xe3, 0x4e, 0x8a,
0xbb, 0x7a, 0x54, 0x2c, 0xe1, 0x18, 0x1c, 0x90, 0x14, 0xe7, 0x5a, 0xe8, 0xd9, 0xc9, 0x29, 0x20,
0x12, 0x5e, 0x0a, 0xcf, 0xdc, 0xcd, 0x16, 0x86, 0xde, 0x72, 0x0e, 0x41, 0x52, 0x91, 0x74, 0x4c,
0x68, 0x50, 0xc1, 0x91, 0xcc, 0x92, 0xca, 0x42, 0x8a, 0x6a, 0x1a, 0xfd, 0x37, 0x70, 0x61, 0xab,
0x18, 0x21, 0x07, 0x0e, 0xc5, 0x62, 0x02, 0xc8, 0xf8, 0xe5, 0xa3, 0x94, 0x38, 0xff, 0x40, 0xbf,
0xee, 0x77, 0xa1, 0x5f, 0x19, 0x91, 0x26, 0x72, 0xc0, 0x32, 0x1b, 0x8a, 0xab, 0xc3, 0x2a, 0x00,
0x50, 0xee, 0xd9, 0xc9, 0xa4, 0x07, 0x04, 0x7c, 0xa1, 0xd7, 0xbb, 0xba, 0x46, 0x64, 0xbc, 0x07,
0x00, 0x30, 0x02, 0x1d, 0xe4, 0x64, 0xc9, 0x0d, 0x2a, 0xfc, 0x3a, 0xdb, 0xeb, 0x73, 0x54, 0x2a,
0x97, 0x48, 0xa3, 0x06, 0xe7, 0x36, 0x1c, 0xae, 0xbb, 0xe2, 0x3a, 0xa7, 0x4f, 0xa4, 0x39, 0x67,
0xc3, 0xab, 0x1f, 0x13, 0x30, 0xa2, 0x5c, 0x49, 0x52, 0x04, 0xf5, 0x46, 0x74, 0x50, 0xae, 0xa8,
0xd3, 0xae, 0x33, 0x84, 0x9f, 0x8c, 0x27, 0xfc, 0x42, 0xa4, 0x44, 0x4f, 0x2d, 0xa2, 0xb9, 0x84,
0x43, 0x46, 0x87, 0x6b, 0x4e, 0xb3, 0xa4, 0x47, 0x5c, 0xd1, 0xc2, 0xac, 0x0f, 0x34, 0x99, 0x00,
0xfc, 0xc9, 0xab, 0x85, 0x0e, 0x49, 0x9f, 0xf4, 0x95, 0x7f, 0xc3, 0x8f, 0x35, 0xd0, 0x3c, 0xbe,
0x7c, 0xbc, 0x2d, 0xe4, 0xd7, 0x03, 0x62, 0x86, 0xd8, 0x4d, 0x3d, 0x65, 0xc0, 0xa3, 0x7d, 0xc1,
0x83, 0x70, 0xd0, 0x3a, 0x1b, 0xd6, 0x32, 0x46, 0xf4, 0xb6, 0x95, 0x09, 0xf7, 0xca, 0x71, 0xa8,
0x05, 0x7b, 0xbb, 0xcb, 0x8e, 0x8f, 0x11, 0x79, 0x1a, 0xd1, 0xdd, 0x41, 0x3f, 0x95, 0x2b, 0xdf,
0x31, 0x11, 0xa2, 0xe4, 0x56, 0x04, 0x11, 0x40, 0x68, 0x6b, 0xa7, 0x22, 0xa3, 0xb7, 0x7a, 0x95,
0x2d, 0xa7, 0xd3, 0x61, 0x68, 0xb5, 0x26, 0x82, 0x8f, 0xb6, 0x21, 0xb3, 0xae, 0x12, 0x1c, 0xa6,
0x22, 0x2f, 0xd2, 0x5e, 0x28, 0x14, 0x01, 0x94, 0xb9, 0x56, 0x88, 0x9f, 0x56, 0xd0, 0xee, 0x02,
0xd3, 0x58, 0x6c, 0x9d, 0xc0, 0x0a, 0xf8, 0x0b, 0xdf, 0xea, 0xf0, 0xf9, 0xe5, 0xbb, 0x64, 0x46,
0x29, 0x67, 0xa8, 0xaa, 0xb0, 0xb4, 0x24, 0xb2, 0x85, 0x20, 0x14, 0x42, 0x73, 0xe0, 0x53, 0xed,
0xa0, 0x0f, 0x23, 0x7f, 0xd0, 0x9e, 0x98, 0xd2, 0x69, 0x64, 0x9b, 0xb1, 0x9c, 0xcd, 0x06, 0x8f,
0x64, 0x52, 0x45, 0x24, 0x13, 0x35, 0x34, 0xbf, 0x52, 0xff, 0x4a, 0x1f, 0x96, 0x6a, 0xc5, 0x38,
0xb3, 0x50, 0xf6, 0xe3, 0xb0, 0x7b, 0x3f, 0x3e, 0x67, 0xa7, 0x5b, 0x4e, 0x91, 0x27, 0xb5, 0x46,
0x71, 0x0c, 0x50, 0xb1, 0xfb, 0xb5, 0x90, 0x9a, 0x8d, 0xa5, 0x7b, 0x36, 0x11, 0x97, 0x56, 0xd8,
0x31, 0x2c, 0x54, 0xe0, 0x12, 0x68, 0x1e, 0x86, 0x8c, 0x10, 0x36, 0xce, 0x12, 0x3b, 0xad, 0x8b,
0xf1, 0x45, 0x97, 0xb8, 0x76, 0x19, 0x38, 0x99, 0x72, 0x87, 0x78, 0x1d, 0x6e, 0xe6, 0x75, 0x70,
0x05, 0x3b, 0x1e, 0xfb, 0xe8, 0xba, 0x94, 0x67, 0x6e, 0x3e, 0x32, 0x86, 0xa3, 0x77, 0x07, 0xfc,
0xa1, 0x05, 0x03, 0x97, 0x72, 0x7b, 0x9b, 0x8e, 0xd0, 0x63, 0x5a, 0xc4, 0x58, 0x1b, 0x5d, 0x95,
0xe9, 0x49, 0x80, 0x7a, 0xfc, 0xcb, 0x08, 0xa4, 0x4d, 0xf6, 0x5d, 0x73, 0x77, 0xe1, 0x19, 0x1d,
0xaf, 0x67, 0xa8, 0x6e, 0x37, 0xa9, 0x19, 0xe7, 0xa0, 0x17, 0x86, 0x62, 0x13, 0xde, 0x48, 0x81,
0x72, 0x3b, 0xc2, 0xba, 0xdb, 0x4c, 0x9b, 0x0b, 0xab, 0x10, 0x2c, 0xf9, 0xc1, 0x0e, 0xc4, 0x2f,
0x16, 0x35, 0x26, 0x91, 0xf2, 0xf8, 0x33, 0xc4, 0x01, 0x46, 0x3e, 0xb3, 0x21, 0x66, 0x62, 0xf7,
0x5e, 0xae, 0x53, 0x7e, 0xdf, 0x62, 0xad, 0x96, 0x58, 0xc5, 0x52, 0x46, 0xb4, 0x13, 0x6a, 0x9f,
0x69, 0x32, 0x55, 0xc8, 0xd4, 0xcd, 0x12, 0xa4, 0x6a, 0x7d, 0x31, 0x6a, 0x6e, 0x13, 0x56, 0xfc,
0x8d, 0x2c, 0xe8, 0xf4, 0x54, 0x83, 0xaa, 0x2a, 0x00, 0xfd, 0xdd, 0xee, 0x95, 0x27, 0xbe, 0xcf,
0x58, 0xb1, 0xa5, 0xdf, 0x1e, 0x2b, 0x18, 0x98, 0x3c, 0x6e, 0x1f, 0x5e, 0x93, 0xdf, 0x90, 0x2c,
0x7d, 0xae, 0x89, 0xa7, 0x56, 0x59, 0x27, 0x5c, 0x15, 0x22, 0xf9, 0xf4, 0xdc, 0x71, 0x00, 0xfe,
0x69, 0x9c, 0x34, 0x56, 0x07, 0x10, 0x1c, 0x47, 0x47, 0x6c, 0xa0, 0x43, 0x74, 0x68, 0x89, 0x8c,
0x31, 0xd2, 0x69, 0x11, 0x94, 0x7f, 0x45, 0x01, 0x5a, 0x0e, 0x50, 0x75, 0xf6, 0x70, 0xa5, 0x5f,
0xc1, 0x78, 0x45, 0xd8, 0x1d, 0x2b, 0xb6, 0xbc, 0x0f, 0xb8, 0xab, 0x13, 0x40, 0xf6, 0xb5, 0x43,
0x82, 0x7d, 0xe5, 0x53, 0x63, 0x6a, 0xf7, 0xed, 0xf4, 0xf0, 0x56, 0x75, 0xdd, 0xc0, 0x8e, 0xa0,
0x68, 0x66, 0xf1, 0xce, 0x08, 0x73, 0xbb, 0xd4, 0xff, 0x3e, 0x10, 0xbb, 0xca, 0x51, 0x48, 0x44,
0xe7, 0x76, 0x37, 0x98, 0x0e, 0x80, 0xa5, 0x00, 0x46, 0xb3, 0x22, 0x02, 0x62, 0xe7, 0xef, 0x24,
0x3a, 0xeb, 0x9c, 0x53, 0x30, 0x4f, 0x39, 0x38, 0x0b, 0xc0, 0x4c, 0x7b, 0xbf, 0xbf, 0xb4, 0xc8,
0xf6, 0x5e, 0x69, 0x26, 0xfb, 0xdb, 0x0d, 0x80, 0x94, 0xd3, 0x4e, 0xa0, 0x51, 0x5b, 0xb2, 0x8d,
0x5c, 0x31, 0xc9, 0x0f, 0x8c, 0xf5, 0xa9, 0x7f, 0x1b, 0xe8, 0x78, 0x51, 0x41, 0xdb, 0xf6, 0x40,
0x62, 0x5d, 0x9b, 0x49, 0xbe, 0x09, 0x03, 0xc4, 0x43, 0xcc, 0xb1, 0xc5, 0xf8, 0x14, 0x9f, 0x05,
0xa0, 0x4c, 0x93, 0x49, 0x3c, 0x7a, 0x05, 0xee, 0x35, 0x91, 0x38, 0xc7, 0xb0, 0x8a, 0xea, 0x1b,
0x01, 0xcc, 0xc7, 0xb5, 0x0e, 0x02, 0xa8, 0xe2, 0xa3, 0x01, 0x81, 0x6c, 0x0a, 0x6a, 0xc3, 0x0d,
0x0d, 0x4d, 0x58, 0x41, 0xcb, 0xfc, 0x36, 0x1e, 0x15, 0xf4, 0x89, 0xca, 0x1c, 0xbc, 0xd4, 0xd8,
0x70, 0x36, 0x1d, 0x6d, 0x30, 0x7b, 0x28, 0x8d, 0x94, 0x4d, 0x8e, 0x02, 0xf3, 0x06, 0x44, 0x39,
0xf4, 0xfe, 0xde, 0x2a, 0x45, 0xf2, 0xb5, 0xcb, 0x44, 0xe2, 0xd7, 0x41, 0x4f, 0xfb, 0x0a, 0x86,
0xbf, 0x47, 0x21, 0x70, 0x17, 0x4d, 0x33, 0x5e, 0xd7, 0x00, 0x13, 0x47, 0xa3, 0x56, 0x90, 0x04,
0x43, 0x5c, 0xf8, 0x61, 0x2b, 0xf8, 0x83, 0xe5, 0x5b, 0x48, 0x82, 0x0c, 0xbb, 0x92, 0xf5, 0xdc,
0x03, 0xd3, 0x9b, 0xc6, 0x12, 0xb7, 0x34, 0x65, 0x28, 0xac, 0x45, 0x11, 0x61, 0x73, 0x58, 0x87,
0xb2, 0xc7, 0x2c, 0xd8, 0x79, 0x28, 0xa5, 0x1f, 0xd3, 0x0b, 0xb6, 0x7a, 0x30, 0xa1, 0x9c, 0x25,
0x23, 0x7b, 0x74, 0x17, 0xc4, 0xc6, 0x7c, 0xa9, 0x66, 0xeb, 0xe1, 0x2d, 0x74, 0x82, 0xc7, 0xe8,
0xb3, 0xa6, 0xcd, 0x92, 0x15, 0x87, 0x0c, 0x2a, 0x0b, 0x04, 0x64, 0xf9, 0x3f, 0x81, 0x95, 0x5c,
0xb2, 0x1c, 0x6d, 0xf7, 0xa4, 0x0b, 0xb9, 0xcd, 0xfe, 0x05, 0x9c, 0x4a, 0x66, 0xc3, 0xef, 0x0e,
0x6b, 0xb9, 0xb2, 0x56, 0x1b, 0x82, 0x2f, 0xc1, 0x46, 0xbe, 0x31, 0xcb, 0x50, 0xdf, 0xa6, 0xe5,
0xa8, 0x97, 0x2e, 0x13, 0xe2, 0xe3, 0x1d, 0x84, 0xa7, 0x4b, 0x45, 0x35, 0xb9, 0x6c, 0xa8, 0x1f,
0x56, 0x3f, 0x30, 0xa8, 0x6c, 0x32, 0xb8, 0xae, 0xd0, 0x95, 0xd0, 0x5b, 0x8d, 0xec, 0x37, 0xb7,
0xa7, 0x9f, 0xe6, 0x4f, 0xdc, 0xd1, 0x4a, 0xf9, 0xf0, 0x04, 0x6e, 0x93, 0x57, 0xbb, 0xbe, 0xf9,
0xd2, 0x37, 0x2e, 0x14, 0x14, 0x54, 0xbe, 0xad, 0x9f, 0xad, 0xdd, 0x1c, 0x8e, 0x07, 0x6f, 0xb7,
0x28, 0xc7, 0xe7, 0x5a, 0x5d, 0x70, 0x52, 0x96, 0x14, 0x5f, 0x44, 0xcc, 0xa0, 0xac, 0x0b, 0x2c,
0xac, 0xe6, 0xe8, 0xba, 0x7a, 0x50, 0x29, 0x86, 0x88, 0xe7, 0x0d, 0x5c, 0xef, 0xa4, 0x87, 0x1b,
0x71, 0xfd, 0xe9, 0x68, 0xb1, 0xae, 0xf6, 0xcd, 0xd7, 0xdf, 0x2a, 0xbf, 0x46, 0x45, 0xf0, 0x45,
0xae, 0x1a, 0xef, 0x89, 0x31, 0x17, 0x1d, 0x37, 0xba, 0xed, 0x0a, 0x0c, 0xf5, 0x9f, 0x40, 0x4f,
0x33, 0x80, 0x3a, 0xb4, 0x88, 0xa4, 0x30, 0x25, 0xe8, 0x4f, 0x03, 0xb4, 0x37, 0x12, 0x9d, 0x52,
0x3e, 0xd5, 0xb8, 0x24, 0xdc, 0xd1, 0x35, 0xe6, 0xda, 0xa1, 0xd2, 0x02, 0x04, 0x58, 0x07, 0xdd,
0xd0, 0x6a, 0x7b, 0xd6, 0x47, 0x0c, 0xaa, 0xcc, 0xe9, 0xf6, 0x11, 0xd3, 0xbd, 0xf7, 0x09, 0xab,
0xd2, 0xf3, 0xd1, 0xda, 0x9c, 0xf0, 0x2f, 0x20, 0x14, 0x14, 0x78, 0xf5, 0x31, 0x7b, 0x19, 0x64,
0x13, 0x1e, 0xbb, 0x18, 0x60, 0x1d, 0xcd, 0xa2, 0x52, 0x2e, 0x64, 0x79, 0xd2, 0xca, 0x81, 0xe5,
0x6d, 0x4c, 0xe5, 0x52, 0xb5, 0x96, 0x0f, 0xc8, 0x80, 0x1a, 0x27, 0x69, 0x22, 0xef, 0x67, 0xde,
0x7b, 0xf9, 0xaf, 0xfe, 0x34, 0x88, 0x1e, 0x2a, 0xb8, 0xbe, 0x10, 0xb7, 0x6e, 0xec, 0x73, 0x80,
0x9d, 0xca, 0x48, 0xbd, 0xd3, 0xf7, 0x3d, 0xbb, 0xa8, 0x7c, 0x73, 0xbb, 0x1f, 0x2d, 0x1b, 0xd9,
0x85, 0xf6, 0x16, 0x7e, 0xdd, 0x48, 0x87, 0x23, 0x95, 0xe3, 0x79, 0x07, 0xb9, 0xd9, 0x9f, 0xca,
0x59, 0x2b, 0x7b, 0x82, 0x3e, 0x45, 0x00, 0x1f, 0xff, 0x01, 0x98, 0x56, 0x06, 0x0b, 0xc4, 0xe9,
0x65, 0xf7, 0xac, 0x2a, 0x5d, 0x48, 0x9e, 0x6b, 0x02, 0x6a, 0x2d, 0xdf, 0x50, 0x87, 0x4b, 0x21,
0x16, 0x74, 0x24, 0x99, 0xac, 0x2e, 0x11, 0x00, 0x44, 0xbb, 0x2e, 0x45, 0x65, 0xf7, 0x11, 0xd5,
0xdb, 0xfc, 0x66, 0xed, 0xd9, 0x14, 0x54, 0x52, 0xc7, 0x44, 0xbb, 0x9b, 0x9b, 0x5d, 0x60, 0x69,
0xbc, 0x43, 0xc3, 0x59, 0xdc, 0x99, 0xf5, 0x18, 0xdd, 0x92, 0x03, 0x24, 0xa8, 0xda, 0x5b, 0x91,
0xc0, 0xf5, 0x51, 0x24, 0x8a, 0x75, 0x1b, 0x50, 0x86, 0x2d, 0x3a, 0xf7, 0x37, 0x36, 0x13, 0x1c,
0x8c, 0x29, 0xae, 0xa1, 0x38, 0x5a, 0x89, 0x01, 0x01, 0x04, 0x57, 0x45, 0x54, 0x48, 0x01, 0x51,
0x23, 0x84, 0x58, 0xb0, 0xd0, 0xdd, 0x6d, 0x49, 0x3e, 0xc9, 0x64, 0xa7, 0x46, 0x21, 0x17, 0x23,
0x7e, 0xa2, 0x14, 0xab, 0x8b, 0xb5, 0x4b, 0x5a, 0x7d, 0x9e, 0x00, 0x5f, 0x56, 0x06, 0x86, 0x5f,
0x5c, 0x7c, 0x04, 0xad, 0xb7, 0x14, 0x97, 0x25, 0xe0, 0x2a, 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc9, 0xcd, 0x43, 0x2e, 0xde, 0xa8, 0x73, 0x19, 0xb8, 0xbd, 0xf5, 0xb4, 0x00, 0xd1,
0x7c, 0xb0, 0xd4, 0x74, 0x3f, 0x21, 0x74, 0xc1, 0x50, 0x37, 0xc7, 0xfd, 0x9e, 0x5c, 0xdc, 0xe9,
0x45, 0x86, 0x4c, 0x29, 0xe3, 0x15, 0x3f, 0x0c, 0x0f, 0x8d, 0xf0, 0x15, 0xdd, 0xa9, 0x02, 0x16,
0x6c, 0xda, 0x01, 0x5a, 0xf9, 0x06, 0x33, 0x78, 0xfa, 0xdc, 0xc3, 0xcc, 0x19, 0xad, 0x25, 0xff,
0x82, 0x25, 0x47, 0xea, 0x17, 0x04, 0x55, 0x5d, 0x56, 0x53, 0x69, 0x74, 0xd6, 0x2e, 0x91, 0xfc,
0x3d, 0x6d, 0xcb, 0x39, 0x76, 0xf1, 0x08, 0x26, 0xba, 0xd9, 0x72, 0x21, 0xf4, 0x2d, 0x60, 0x2c,
0x4f, 0x8e, 0x00, 0x3c, 0x99, 0x76, 0x4d, 0x0d, 0xda, 0x13, 0x9b, 0x31, 0x65, 0xda, 0x5d, 0xc4,
0xbf, 0x97, 0x00, 0xc6, 0xa5, 0x63, 0xfc, 0xd0, 0x54, 0x3f, 0x54, 0x9e, 0x7b, 0x19, 0xd4, 0xcc,
0x4c, 0xaf, 0x77, 0x33, 0xbb, 0x23, 0xe1, 0x95, 0x16, 0x4d, 0xde, 0xb6, 0xbf, 0xd4, 0x57, 0x8a,
0x5d, 0x48, 0x12, 0x41, 0x31, 0xd3, 0x18, 0xc0, 0xdc, 0x23, 0xe2, 0xe6, 0xd5, 0x99, 0x50, 0xbe,
0xa6, 0xe5, 0x9f, 0xe4, 0x90, 0xba, 0x1e, 0x9e, 0x26, 0xbd, 0x63, 0xcc, 0xb6, 0x4b, 0x36, 0x4d,
0x91, 0x8c, 0x15, 0x65, 0x4b, 0x72, 0xa6, 0xda, 0xb9, 0x56, 0x7e, 0xf2, 0x57, 0xf2, 0x50, 0x2f,
0xc2, 0xca, 0x84,
]];

View File

@ -152,10 +152,12 @@ impl Network {
pub fn new_regtest(
nu5_activation_height: Option<u32>,
nu6_activation_height: Option<u32>,
nu7_activation_height: Option<u32>,
) -> Self {
Self::new_configured_testnet(testnet::Parameters::new_regtest(
nu5_activation_height,
nu6_activation_height,
nu7_activation_height,
))
}

View File

@ -206,6 +206,9 @@ pub struct ConfiguredActivationHeights {
/// Activation height for `NU6` network upgrade.
#[serde(rename = "NU6")]
pub nu6: Option<u32>,
/// Activation height for `NU7` network upgrade.
#[serde(rename = "NU7")]
pub nu7: Option<u32>,
}
/// Builder for the [`Parameters`] struct.
@ -336,6 +339,7 @@ impl ParametersBuilder {
canopy,
nu5,
nu6,
nu7,
}: ConfiguredActivationHeights,
) -> Self {
use NetworkUpgrade::*;
@ -358,6 +362,7 @@ impl ParametersBuilder {
.chain(canopy.into_iter().map(|h| (h, Canopy)))
.chain(nu5.into_iter().map(|h| (h, Nu5)))
.chain(nu6.into_iter().map(|h| (h, Nu6)))
.chain(nu7.into_iter().map(|h| (h, Nu7)))
.map(|(h, nu)| (h.try_into().expect("activation height must be valid"), nu))
.collect();
@ -588,6 +593,7 @@ impl Parameters {
pub fn new_regtest(
nu5_activation_height: Option<u32>,
nu6_activation_height: Option<u32>,
nu7_activation_height: Option<u32>,
) -> Self {
#[cfg(any(test, feature = "proptest-impl"))]
let nu5_activation_height = nu5_activation_height.or(Some(100));
@ -604,6 +610,7 @@ impl Parameters {
canopy: Some(1),
nu5: nu5_activation_height,
nu6: nu6_activation_height,
nu7: nu7_activation_height,
..Default::default()
})
.with_halving_interval(PRE_BLOSSOM_REGTEST_HALVING_INTERVAL);
@ -647,7 +654,7 @@ impl Parameters {
disable_pow,
pre_blossom_halving_interval,
post_blossom_halving_interval,
} = Self::new_regtest(None, None);
} = Self::new_regtest(None, None, None);
self.network_name == network_name
&& self.genesis_hash == genesis_hash

View File

@ -109,7 +109,7 @@ fn activates_network_upgrades_correctly() {
let expected_activation_height = 1;
let network = testnet::Parameters::build()
.with_activation_heights(ConfiguredActivationHeights {
nu6: Some(expected_activation_height),
nu7: Some(expected_activation_height),
..Default::default()
})
.to_network();
@ -147,7 +147,7 @@ fn activates_network_upgrades_correctly() {
(Network::Mainnet, MAINNET_ACTIVATION_HEIGHTS),
(Network::new_default_testnet(), TESTNET_ACTIVATION_HEIGHTS),
(
Network::new_regtest(None, None),
Network::new_regtest(None, None, None),
expected_default_regtest_activation_heights,
),
] {
@ -198,7 +198,7 @@ fn check_configured_network_name() {
"Mainnet should be displayed as 'Mainnet'"
);
assert_eq!(
Network::new_regtest(None, None).to_string(),
Network::new_regtest(None, None, None).to_string(),
"Regtest",
"Regtest should be displayed as 'Regtest'"
);

View File

@ -15,7 +15,7 @@ use hex::{FromHex, ToHex};
use proptest_derive::Arbitrary;
/// A list of network upgrades in the order that they must be activated.
pub const NETWORK_UPGRADES_IN_ORDER: [NetworkUpgrade; 9] = [
pub const NETWORK_UPGRADES_IN_ORDER: [NetworkUpgrade; 10] = [
Genesis,
BeforeOverwinter,
Overwinter,
@ -25,6 +25,7 @@ pub const NETWORK_UPGRADES_IN_ORDER: [NetworkUpgrade; 9] = [
Canopy,
Nu5,
Nu6,
Nu7,
];
/// A Zcash network upgrade.
@ -61,6 +62,9 @@ pub enum NetworkUpgrade {
/// The Zcash protocol after the NU6 upgrade.
#[serde(rename = "NU6")]
Nu6,
/// The Zcash protocol after the NU7 upgrade.
#[serde(rename = "NU7")]
Nu7,
}
impl fmt::Display for NetworkUpgrade {
@ -90,6 +94,8 @@ pub(super) const MAINNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)]
(block::Height(1_046_400), Canopy),
(block::Height(1_687_104), Nu5),
(block::Height(2_726_400), Nu6),
// FIXME: TODO: Add NU7 with a correct value
// (block::Height(2_726_401), Nu7),
];
/// Fake mainnet network upgrade activation heights, used in tests.
@ -104,6 +110,7 @@ const FAKE_MAINNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] = &[
(block::Height(30), Canopy),
(block::Height(35), Nu5),
(block::Height(40), Nu6),
(block::Height(45), Nu7),
];
/// Testnet network upgrade activation heights.
@ -126,6 +133,8 @@ pub(super) const TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)]
(block::Height(1_028_500), Canopy),
(block::Height(1_842_420), Nu5),
(block::Height(2_976_000), Nu6),
// FIXME: TODO: Set a correct value for NU7
(block::Height(2_942_001), Nu7),
];
/// Fake testnet network upgrade activation heights, used in tests.
@ -140,6 +149,7 @@ const FAKE_TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] = &[
(block::Height(30), Canopy),
(block::Height(35), Nu5),
(block::Height(40), Nu6),
(block::Height(45), Nu7),
];
/// The Consensus Branch Id, used to bind transactions and blocks to a
@ -216,6 +226,8 @@ pub(crate) const CONSENSUS_BRANCH_IDS: &[(NetworkUpgrade, ConsensusBranchId)] =
(Canopy, ConsensusBranchId(0xe9ff75a6)),
(Nu5, ConsensusBranchId(0xc2d6d0b4)),
(Nu6, ConsensusBranchId(0xc8e71055)),
// FIXME: use a proper value below
(Nu7, ConsensusBranchId(0x77777777)),
];
/// The target block spacing before Blossom.
@ -332,7 +344,8 @@ impl NetworkUpgrade {
Heartwood => Some(Canopy),
Canopy => Some(Nu5),
Nu5 => Some(Nu6),
Nu6 => None,
Nu6 => Some(Nu7),
Nu7 => None,
}
}
@ -409,7 +422,9 @@ impl NetworkUpgrade {
pub fn target_spacing(&self) -> Duration {
let spacing_seconds = match self {
Genesis | BeforeOverwinter | Overwinter | Sapling => PRE_BLOSSOM_POW_TARGET_SPACING,
Blossom | Heartwood | Canopy | Nu5 | Nu6 => POST_BLOSSOM_POW_TARGET_SPACING.into(),
Blossom | Heartwood | Canopy | Nu5 | Nu6 | Nu7 => {
POST_BLOSSOM_POW_TARGET_SPACING.into()
}
};
Duration::seconds(spacing_seconds)

View File

@ -18,4 +18,4 @@ pub const TX_V5_VERSION_GROUP_ID: u32 = 0x26A7_270A;
/// group ID.
// FIXME: use a proper value!
#[cfg(feature = "tx-v6")]
pub const TX_V6_VERSION_GROUP_ID: u32 = 0x26A7_270B;
pub const TX_V6_VERSION_GROUP_ID: u32 = 0x124A_69F8;

View File

@ -276,7 +276,8 @@ impl Version for zcash_history::V1 {
NetworkUpgrade::Heartwood
| NetworkUpgrade::Canopy
| NetworkUpgrade::Nu5
| NetworkUpgrade::Nu6 => zcash_history::NodeData {
| NetworkUpgrade::Nu6
| NetworkUpgrade::Nu7 => zcash_history::NodeData {
consensus_branch_id: branch_id.into(),
subtree_commitment: block_hash,
start_time: time,

View File

@ -881,7 +881,7 @@ impl Arbitrary for Transaction {
Self::v4_strategy(ledger_state)
}
// FIXME: should v6_strategy be included here?
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => prop_oneof![
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => prop_oneof![
Self::v4_strategy(ledger_state.clone()),
Self::v5_strategy(ledger_state)
]

View File

@ -376,13 +376,13 @@ impl<V: OrchardFlavorExt> ZcashSerialize for orchard::ShieldedData<V> {
// Denoted as `vSpendAuthSigsOrchard` in the spec.
zcash_serialize_external_count(&sigs, &mut writer)?;
// Denoted as `bindingSigOrchard` in the spec.
self.binding_sig.zcash_serialize(&mut writer)?;
#[cfg(feature = "tx-v6")]
// Denoted as `vAssetBurn` in the spec (ZIP 230).
self.burn.zcash_serialize(&mut writer)?;
// Denoted as `bindingSigOrchard` in the spec.
self.binding_sig.zcash_serialize(&mut writer)?;
Ok(())
}
}
@ -434,6 +434,10 @@ impl<V: OrchardFlavorExt> ZcashDeserialize for Option<orchard::ShieldedData<V>>
let sigs: Vec<Signature<SpendAuth>> =
zcash_deserialize_external_count(actions.len(), &mut reader)?;
// TODO: FIXME: add a proper comment
#[cfg(feature = "tx-v6")]
let burn = (&mut reader).zcash_deserialize_into()?;
// Denoted as `bindingSigOrchard` in the spec.
let binding_sig: Signature<Binding> = (&mut reader).zcash_deserialize_into()?;
@ -448,10 +452,6 @@ impl<V: OrchardFlavorExt> ZcashDeserialize for Option<orchard::ShieldedData<V>>
let actions: AtLeastOne<orchard::AuthorizedAction<V>> = authorized_actions.try_into()?;
// TODO: FIXME: add a proper comment
#[cfg(feature = "tx-v6")]
let burn = (&mut reader).zcash_deserialize_into()?;
Ok(Some(orchard::ShieldedData::<V> {
flags,
value_balance,

View File

@ -237,7 +237,7 @@ fn checkpoint_list_load_hard_coded() -> Result<(), BoxError> {
let _ = Mainnet.checkpoint_list();
let _ = Network::new_default_testnet().checkpoint_list();
let _ = Network::new_regtest(None, None).checkpoint_list();
let _ = Network::new_regtest(None, None, None).checkpoint_list();
Ok(())
}

View File

@ -693,7 +693,8 @@ where
| NetworkUpgrade::Heartwood
| NetworkUpgrade::Canopy
| NetworkUpgrade::Nu5
| NetworkUpgrade::Nu6 => Ok(()),
| NetworkUpgrade::Nu6
| NetworkUpgrade::Nu7 => Ok(()),
// Does not support V4 transactions
NetworkUpgrade::Genesis
@ -781,7 +782,7 @@ where
//
// Note: Here we verify the transaction version number of the above rule, the group
// id is checked in zebra-chain crate, in the transaction serialize.
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => Ok(()),
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => Ok(()),
// Does not support V5 transactions
NetworkUpgrade::Genesis

View File

@ -344,7 +344,8 @@ fn sanitize_transaction_version(
BeforeOverwinter => 2,
Overwinter => 3,
Sapling | Blossom | Heartwood | Canopy => 4,
Nu5 | Nu6 => 5,
// FIXME: Use 6 for Nu7
Nu5 | Nu6 | Nu7 => 5,
}
};

View File

@ -668,12 +668,17 @@ impl<'de> Deserialize<'de> for Config {
(NetworkKind::Mainnet, _) => Network::Mainnet,
(NetworkKind::Testnet, None) => Network::new_default_testnet(),
(NetworkKind::Regtest, testnet_parameters) => {
let (nu5_activation_height, nu6_activation_height) = testnet_parameters
.and_then(|params| params.activation_heights)
.map(|ConfiguredActivationHeights { nu5, nu6, .. }| (nu5, nu6))
.unwrap_or_default();
let (nu5_activation_height, nu6_activation_height, nu7_activation_height) =
testnet_parameters
.and_then(|params| params.activation_heights)
.map(|ConfiguredActivationHeights { nu5, nu6, nu7, .. }| (nu5, nu6, nu7))
.unwrap_or_default();
Network::new_regtest(nu5_activation_height, nu6_activation_height)
Network::new_regtest(
nu5_activation_height,
nu6_activation_height,
nu7_activation_height,
)
}
(
NetworkKind::Testnet,

View File

@ -403,7 +403,7 @@ lazy_static! {
hash_map.insert(NetworkKind::Mainnet, Version::min_specified_for_upgrade(&Mainnet, Nu5));
hash_map.insert(NetworkKind::Testnet, Version::min_specified_for_upgrade(&Network::new_default_testnet(), Nu5));
hash_map.insert(NetworkKind::Regtest, Version::min_specified_for_upgrade(&Network::new_regtest(None, None), Nu5));
hash_map.insert(NetworkKind::Regtest, Version::min_specified_for_upgrade(&Network::new_regtest(None, None, None), Nu5));
hash_map
};

View File

@ -106,6 +106,9 @@ impl Version {
(Mainnet, Nu5) => 170_100,
(Testnet(params), Nu6) if params.is_default_testnet() => 170_110,
(Mainnet, Nu6) => 170_120,
// FIXME: use proper values for Nu7
(Testnet(params), Nu7) if params.is_default_testnet() => 170_111,
(Mainnet, Nu7) => 170_121,
// It should be fine to reject peers with earlier network protocol versions on custom testnets for now.
(Testnet(_), _) => CURRENT_NETWORK_PROTOCOL_VERSION.0,

View File

@ -217,7 +217,7 @@ pub fn proposal_block_from_template(
| NetworkUpgrade::Blossom
| NetworkUpgrade::Heartwood => panic!("pre-Canopy block templates not supported"),
NetworkUpgrade::Canopy => chain_history_root.bytes_in_serialized_order().into(),
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => {
NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => {
block_commitments_hash.bytes_in_serialized_order().into()
}
};

View File

@ -1,5 +1,6 @@
---
source: zebra-rpc/src/methods/tests/snapshot.rs
assertion_line: 562
expression: info
---
{
@ -69,6 +70,11 @@ expression: info
"name": "NU6",
"activationheight": 2976000,
"status": "pending"
},
"c8e71056": {
"name": "NU7",
"activationheight": 2942001,
"status": "pending"
}
},
"consensus": {

View File

@ -2907,7 +2907,7 @@ async fn fully_synced_rpc_z_getsubtreesbyindex_snapshot_test() -> Result<()> {
async fn validate_regtest_genesis_block() {
let _init_guard = zebra_test::init();
let network = Network::new_regtest(None, None);
let network = Network::new_regtest(None, None, None);
let state = zebra_state::init_test(&network);
let (
block_verifier_router,
@ -2982,7 +2982,7 @@ async fn trusted_chain_sync_handles_forks_correctly() -> Result<()> {
use zebra_state::{ReadResponse, Response};
let _init_guard = zebra_test::init();
let mut config = os_assigned_rpc_port_config(false, &Network::new_regtest(None, None))?;
let mut config = os_assigned_rpc_port_config(false, &Network::new_regtest(None, None, None))?;
config.state.ephemeral = false;
let network = config.network.network.clone();

View File

@ -73,6 +73,8 @@ Heartwood = 903_800
Canopy = 1_028_500
NU5 = 1_842_420
NU6 = 2_000_000
# FIXME: Use a proper value for NU7.
NU7 = 2_000_001
[network.testnet_parameters.pre_nu6_funding_streams.height_range]
start = 0

View File

@ -43,7 +43,7 @@ pub(crate) async fn submit_blocks_test() -> Result<()> {
let _init_guard = zebra_test::init();
info!("starting regtest submit_blocks test");
let network = Network::new_regtest(None, None);
let network = Network::new_regtest(None, None, None);
let mut config = os_assigned_rpc_port_config(false, &network)?;
config.mempool.debug_enable_at_height = Some(0);