From 86e1a86461bff5263567af33f20756ce560e22ca Mon Sep 17 00:00:00 2001 From: Aztec Bot <49558828+AztecBot@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:34:25 -0400 Subject: [PATCH] feat: Sync from noir (#5286) Automated pull of development from the [noir](https://github.com/noir-lang/noir) programming language, a dependency of Aztec. BEGIN_COMMIT_OVERRIDE feat: add as_slice builtin function, add execution test (https://github.com/noir-lang/noir/pull/4523) chore: making docs build before cutting versions (https://github.com/noir-lang/noir/pull/4568) chore: fix docker test workflows (https://github.com/noir-lang/noir/pull/4566) feat: allow usage of noir `#[test]` syntax in stdlib (https://github.com/noir-lang/noir/pull/4553) feat: Add more impls on Option (https://github.com/noir-lang/noir/pull/4549) chore: fixing some broken links (https://github.com/noir-lang/noir/pull/4556) chore: separate tests for execution failures from compilation failures (https://github.com/noir-lang/noir/pull/4559) feat: remove curly braces with fmt (https://github.com/noir-lang/noir/pull/4529) fix: Make `nargo` the default binary for cargo run (https://github.com/noir-lang/noir/pull/4554) fix: Evaluate operators in globals in types (https://github.com/noir-lang/noir/pull/4537) chore: Add more `Hash` impls to stdlib (https://github.com/noir-lang/noir/pull/4470) END_COMMIT_OVERRIDE --------- Co-authored-by: sirasistant --- .../.github/scripts/noir-wasm-build.sh | 1 + .../src/brillig/brillig_gen/brillig_block.rs | 63 ++++++--- .../noirc_evaluator/src/ssa/acir_gen/mod.rs | 54 ++++++- .../noirc_evaluator/src/ssa/ir/instruction.rs | 4 + .../src/ssa/ir/instruction/call.rs | 10 ++ .../noir/standard_library/black_box_fns.md | 18 +-- noir/noir-repo/docs/package.json | 2 +- .../noir/standard_library/black_box_fns.md | 18 +-- .../noir/standard_library/black_box_fns.md | 18 +-- .../NoirJS/backend_barretenberg/.nojekyll | 1 + .../classes/BarretenbergBackend.md | 127 +++++++++++++++++ .../NoirJS/backend_barretenberg/index.md | 46 ++++++ .../interfaces/Backend.md | 132 ++++++++++++++++++ .../type-aliases/BackendOptions.md | 21 +++ .../type-aliases/CompiledCircuit.md | 20 +++ .../type-aliases/ProofData.md | 20 +++ .../backend_barretenberg/typedoc-sidebar.cjs | 4 + .../reference/NoirJS/noir_js/.nojekyll | 1 + .../reference/NoirJS/noir_js/classes/Noir.md | 132 ++++++++++++++++++ .../reference/NoirJS/noir_js/functions/and.md | 22 +++ .../NoirJS/noir_js/functions/blake2s256.md | 21 +++ .../functions/ecdsa_secp256k1_verify.md | 28 ++++ .../functions/ecdsa_secp256r1_verify.md | 28 ++++ .../NoirJS/noir_js/functions/keccak256.md | 21 +++ .../NoirJS/noir_js/functions/sha256.md | 21 +++ .../reference/NoirJS/noir_js/functions/xor.md | 22 +++ .../reference/NoirJS/noir_js/index.md | 37 +++++ .../noir_js/type-aliases/CompiledCircuit.md | 20 +++ .../type-aliases/ForeignCallHandler.md | 24 ++++ .../noir_js/type-aliases/ForeignCallInput.md | 9 ++ .../noir_js/type-aliases/ForeignCallOutput.md | 9 ++ .../NoirJS/noir_js/type-aliases/InputMap.md | 13 ++ .../NoirJS/noir_js/type-aliases/ProofData.md | 20 +++ .../NoirJS/noir_js/type-aliases/WitnessMap.md | 9 ++ .../NoirJS/noir_js/typedoc-sidebar.cjs | 4 + .../reference/NoirJS/noir_wasm/.nojekyll | 1 + .../NoirJS/noir_wasm/functions/compile.md | 51 +++++++ .../noir_wasm/functions/compile_contract.md | 51 +++++++ .../noir_wasm/functions/createFileManager.md | 21 +++ .../functions/inflateDebugSymbols.md | 21 +++ .../reference/NoirJS/noir_wasm/index.md | 49 +++++++ .../NoirJS/noir_wasm/typedoc-sidebar.cjs | 4 + noir/noir-repo/noir_stdlib/src/array.nr | 10 +- noir/noir-repo/noir_stdlib/src/field/bn254.nr | 78 +++++++++++ noir/noir-repo/noir_stdlib/src/option.nr | 52 +++++++ .../field_comparisons/Nargo.toml | 6 - .../field_comparisons/Prover.toml | 1 - .../field_comparisons/src/main.nr | 86 ------------ .../array_to_slice/Nargo.toml | 7 + .../array_to_slice/Prover.toml | 2 + .../array_to_slice/src/main.nr | 33 +++++ .../brillig_array_to_slice/Nargo.toml | 7 + .../brillig_array_to_slice/Prover.toml | 1 + .../brillig_array_to_slice/src/main.nr | 18 +++ .../tooling/nargo_cli/tests/stdlib-tests.rs | 62 ++++++++ .../__snapshots__/contract_class.test.ts.snap | 10 +- .../__snapshots__/index.test.ts.snap | 10 +- 57 files changed, 1422 insertions(+), 159 deletions(-) create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/.nojekyll create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/index.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/interfaces/Backend.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/CompiledCircuit.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/ProofData.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/typedoc-sidebar.cjs create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/.nojekyll create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/classes/Noir.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/and.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/blake2s256.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/keccak256.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/sha256.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/xor.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/index.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/CompiledCircuit.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallInput.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallOutput.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/InputMap.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ProofData.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/WitnessMap.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/typedoc-sidebar.cjs create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/.nojekyll create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/compile.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/compile_contract.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/createFileManager.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/inflateDebugSymbols.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/index.md create mode 100644 noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/typedoc-sidebar.cjs delete mode 100644 noir/noir-repo/test_programs/compile_success_empty/field_comparisons/Nargo.toml delete mode 100644 noir/noir-repo/test_programs/compile_success_empty/field_comparisons/Prover.toml delete mode 100644 noir/noir-repo/test_programs/compile_success_empty/field_comparisons/src/main.nr create mode 100644 noir/noir-repo/test_programs/execution_success/array_to_slice/Nargo.toml create mode 100644 noir/noir-repo/test_programs/execution_success/array_to_slice/Prover.toml create mode 100644 noir/noir-repo/test_programs/execution_success/array_to_slice/src/main.nr create mode 100644 noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/Nargo.toml create mode 100644 noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/Prover.toml create mode 100644 noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/src/main.nr create mode 100644 noir/noir-repo/tooling/nargo_cli/tests/stdlib-tests.rs diff --git a/noir/noir-repo/.github/scripts/noir-wasm-build.sh b/noir/noir-repo/.github/scripts/noir-wasm-build.sh index f799387b6f6..48e3ad73769 100755 --- a/noir/noir-repo/.github/scripts/noir-wasm-build.sh +++ b/noir/noir-repo/.github/scripts/noir-wasm-build.sh @@ -2,4 +2,5 @@ set -eu .github/scripts/wasm-pack-install.sh +yarn workspace @noir-lang/types build yarn workspace @noir-lang/noir_wasm build diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs index 5b6610df7b4..9c5eeec078c 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs @@ -451,6 +451,29 @@ impl<'block> BrilligBlock<'block> { self.convert_ssa_array_len(arguments[0], result_variable.address, dfg); } } + Value::Intrinsic(Intrinsic::AsSlice) => { + let source_variable = self.convert_ssa_value(arguments[0], dfg); + let result_ids = dfg.instruction_results(instruction_id); + let destination_len_variable = self.variables.define_single_addr_variable( + self.function_context, + self.brillig_context, + result_ids[0], + dfg, + ); + let destination_variable = self.variables.define_variable( + self.function_context, + self.brillig_context, + result_ids[1], + dfg, + ); + let source_size_as_register = + self.convert_ssa_array_set(source_variable, destination_variable, None); + + // we need to explicitly set the destination_len_variable + self.brillig_context + .mov_instruction(destination_len_variable.address, source_size_as_register); + self.brillig_context.deallocate_register(source_size_as_register); + } Value::Intrinsic( Intrinsic::SlicePushBack | Intrinsic::SlicePopBack @@ -610,13 +633,12 @@ impl<'block> BrilligBlock<'block> { dfg, ); self.validate_array_index(source_variable, index_register); - - self.convert_ssa_array_set( + let source_size_as_register = self.convert_ssa_array_set( source_variable, destination_variable, - index_register.address, - value_variable, + Some((index_register.address, value_variable)), ); + self.brillig_context.deallocate_register(source_size_as_register); } Instruction::RangeCheck { value, max_bit_size, assert_message } => { let value = self.convert_ssa_single_addr_value(*value, dfg); @@ -811,23 +833,25 @@ impl<'block> BrilligBlock<'block> { /// Array set operation in SSA returns a new array or slice that is a copy of the parameter array or slice /// With a specific value changed. + /// + /// Returns `source_size_as_register`, which is expected to be deallocated with: + /// `self.brillig_context.deallocate_register(source_size_as_register)` fn convert_ssa_array_set( &mut self, source_variable: BrilligVariable, destination_variable: BrilligVariable, - index_register: MemoryAddress, - value_variable: BrilligVariable, - ) { + opt_index_and_value: Option<(MemoryAddress, BrilligVariable)>, + ) -> MemoryAddress { let destination_pointer = match destination_variable { BrilligVariable::BrilligArray(BrilligArray { pointer, .. }) => pointer, BrilligVariable::BrilligVector(BrilligVector { pointer, .. }) => pointer, - _ => unreachable!("ICE: array set returns non-array"), + _ => unreachable!("ICE: array_set SSA returns non-array"), }; let reference_count = match source_variable { BrilligVariable::BrilligArray(BrilligArray { rc, .. }) | BrilligVariable::BrilligVector(BrilligVector { rc, .. }) => rc, - _ => unreachable!("ICE: array set on non-array"), + _ => unreachable!("ICE: array_set SSA on non-array"), }; let (source_pointer, source_size_as_register) = match source_variable { @@ -841,7 +865,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.mov_instruction(source_size_register, size); (pointer, source_size_register) } - _ => unreachable!("ICE: array set on non-array"), + _ => unreachable!("ICE: array_set SSA on non-array"), }; // Here we want to compare the reference count against 1. @@ -884,18 +908,20 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.mov_instruction(target_size, source_size_as_register); self.brillig_context.usize_const_instruction(target_rc, 1_usize.into()); } - _ => unreachable!("ICE: array set on non-array"), + _ => unreachable!("ICE: array_set SSA on non-array"), } - // Then set the value in the newly created array - self.store_variable_in_array( - destination_pointer, - SingleAddrVariable::new_usize(index_register), - value_variable, - ); + if let Some((index_register, value_variable)) = opt_index_and_value { + // Then set the value in the newly created array + self.store_variable_in_array( + destination_pointer, + SingleAddrVariable::new_usize(index_register), + value_variable, + ); + } - self.brillig_context.deallocate_register(source_size_as_register); self.brillig_context.deallocate_register(condition); + source_size_as_register } pub(crate) fn store_variable_in_array_with_ctx( @@ -1351,6 +1377,7 @@ impl<'block> BrilligBlock<'block> { Value::Param { .. } | Value::Instruction { .. } => { // All block parameters and instruction results should have already been // converted to registers so we fetch from the cache. + self.variables.get_allocation(self.function_context, value_id, dfg) } Value::NumericConstant { constant, .. } => { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs index 4442efe286a..5a4fa021f1f 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs @@ -1025,7 +1025,13 @@ impl Context { self.array_set_value(&store_value, result_block_id, &mut var_index)?; let element_type_sizes = if !can_omit_element_sizes_array(&array_typ) { - Some(self.init_element_type_sizes_array(&array_typ, array_id, None, dfg)?) + let acir_value = self.convert_value(array_id, dfg); + Some(self.init_element_type_sizes_array( + &array_typ, + array_id, + Some(&acir_value), + dfg, + )?) } else { None }; @@ -1246,7 +1252,8 @@ impl Context { let read = self.acir_context.read_from_memory(source, &index_var)?; Ok::(AcirValue::Var(read, AcirType::field())) })?; - self.initialize_array(destination, array_len, Some(AcirValue::Array(init_values.into())))?; + let array: im::Vector = init_values.into(); + self.initialize_array(destination, array_len, Some(AcirValue::Array(array)))?; Ok(()) } @@ -1663,6 +1670,49 @@ impl Context { }; Ok(vec![AcirValue::Var(self.acir_context.add_constant(len), AcirType::field())]) } + Intrinsic::AsSlice => { + let (slice_contents, slice_typ, block_id) = + self.check_array_is_initialized(arguments[0], dfg)?; + assert!(!slice_typ.is_nested_slice(), "ICE: Nested slice used in ACIR generation"); + + let result_block_id = self.block_id(&result_ids[1]); + let acir_value = self.convert_value(slice_contents, dfg); + + let array_len = if !slice_typ.contains_slice_element() { + slice_typ.flattened_size() + } else { + self.flattened_slice_size(slice_contents, dfg) + }; + let slice_length = self.acir_context.add_constant(array_len); + self.copy_dynamic_array(block_id, result_block_id, array_len)?; + + let element_type_sizes = if !can_omit_element_sizes_array(&slice_typ) { + Some(self.init_element_type_sizes_array( + &slice_typ, + slice_contents, + Some(&acir_value), + dfg, + )?) + } else { + None + }; + + let value_types = self.convert_value(slice_contents, dfg).flat_numeric_types(); + assert!( + array_len == value_types.len(), + "AsSlice: unexpected length difference: {:?} != {:?}", + array_len, + value_types.len() + ); + + let result = AcirValue::DynamicArray(AcirDynamicArray { + block_id: result_block_id, + len: value_types.len(), + value_types, + element_type_sizes, + }); + Ok(vec![AcirValue::Var(slice_length, AcirType::field()), result]) + } Intrinsic::SlicePushBack => { // arguments = [slice_length, slice_contents, ...elements_to_push] let slice_length = self.convert_value(arguments[0], dfg).into_var()?; diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs index afade4b0616..dd190c112f3 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs @@ -37,6 +37,7 @@ pub(crate) type InstructionId = Id; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub(crate) enum Intrinsic { ArrayLen, + AsSlice, AssertConstant, SlicePushBack, SlicePushFront, @@ -57,6 +58,7 @@ impl std::fmt::Display for Intrinsic { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Intrinsic::ArrayLen => write!(f, "array_len"), + Intrinsic::AsSlice => write!(f, "as_slice"), Intrinsic::AssertConstant => write!(f, "assert_constant"), Intrinsic::SlicePushBack => write!(f, "slice_push_back"), Intrinsic::SlicePushFront => write!(f, "slice_push_front"), @@ -89,6 +91,7 @@ impl Intrinsic { Intrinsic::ToBits(_) | Intrinsic::ToRadix(_) => true, Intrinsic::ArrayLen + | Intrinsic::AsSlice | Intrinsic::SlicePushBack | Intrinsic::SlicePushFront | Intrinsic::SlicePopBack @@ -109,6 +112,7 @@ impl Intrinsic { pub(crate) fn lookup(name: &str) -> Option { match name { "array_len" => Some(Intrinsic::ArrayLen), + "as_slice" => Some(Intrinsic::AsSlice), "assert_constant" => Some(Intrinsic::AssertConstant), "apply_range_constraint" => Some(Intrinsic::ApplyRangeConstraint), "slice_push_back" => Some(Intrinsic::SlicePushBack), diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call.rs index 9349d58c4d9..8b800e0db54 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call.rs @@ -84,6 +84,16 @@ pub(super) fn simplify_call( SimplifyResult::None } } + Intrinsic::AsSlice => { + let slice = dfg.get_array_constant(arguments[0]); + if let Some((slice, element_type)) = slice { + let slice_length = dfg.make_constant(slice.len().into(), Type::length_type()); + let new_slice = dfg.make_array(slice, element_type); + SimplifyResult::SimplifiedToMultiple(vec![slice_length, new_slice]) + } else { + SimplifyResult::None + } + } Intrinsic::SlicePushBack => { let slice = dfg.get_array_constant(arguments[1]); if let Some((mut slice, element_type)) = slice { diff --git a/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md index eae8744abf0..be8c65679c3 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md +++ b/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md @@ -12,18 +12,18 @@ The ACVM spec defines a set of blackbox functions which backends will be expecte Here is a list of the current black box functions: -- [SHA256](./cryptographic_primitives/hashes#sha256) -- [Schnorr signature verification](./cryptographic_primitives/schnorr) -- [Blake2s](./cryptographic_primitives/hashes#blake2s) -- [Blake3](./cryptographic_primitives/hashes#blake3) -- [Pedersen Hash](./cryptographic_primitives/hashes#pedersen_hash) -- [Pedersen Commitment](./cryptographic_primitives/hashes#pedersen_commitment) -- [ECDSA signature verification](./cryptographic_primitives/ecdsa_sig_verification) -- [Fixed base scalar multiplication](./cryptographic_primitives/scalar) +- [SHA256](./cryptographic_primitives/hashes.mdx#sha256) +- [Schnorr signature verification](./cryptographic_primitives/schnorr.mdx) +- [Blake2s](./cryptographic_primitives/hashes.mdx#blake2s) +- [Blake3](./cryptographic_primitives/hashes.mdx#blake3) +- [Pedersen Hash](./cryptographic_primitives/hashes.mdx#pedersen_hash) +- [Pedersen Commitment](./cryptographic_primitives/hashes.mdx#pedersen_commitment) +- [ECDSA signature verification](./cryptographic_primitives/ecdsa_sig_verification.mdx) +- [Fixed base scalar multiplication](./cryptographic_primitives/scalar.mdx) - AND - XOR - RANGE -- [Keccak256](./cryptographic_primitives/hashes#keccak256) +- [Keccak256](./cryptographic_primitives/hashes.mdx#keccak256) - [Recursive proof verification](./recursion) Most black box functions are included as part of the Noir standard library, however `AND`, `XOR` and `RANGE` are used as part of the Noir language syntax. For instance, using the bitwise operator `&` will invoke the `AND` black box function. diff --git a/noir/noir-repo/docs/package.json b/noir/noir-repo/docs/package.json index 146c2a9800c..779b72149b1 100644 --- a/noir/noir-repo/docs/package.json +++ b/noir/noir-repo/docs/package.json @@ -8,7 +8,7 @@ "build": "yarn preprocess && yarn version::stables && docusaurus build", "version::stables": "ts-node ./scripts/setStable.ts", "serve": "serve build", - "version": "yarn preprocess && docusaurus docs:version" + "version": "yarn preprocess && docusaurus build && docusaurus docs:version" }, "dependencies": { "@docusaurus/core": "^3.0.1", diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.24.0/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/versioned_docs/version-v0.24.0/noir/standard_library/black_box_fns.md index eae8744abf0..be8c65679c3 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.24.0/noir/standard_library/black_box_fns.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.24.0/noir/standard_library/black_box_fns.md @@ -12,18 +12,18 @@ The ACVM spec defines a set of blackbox functions which backends will be expecte Here is a list of the current black box functions: -- [SHA256](./cryptographic_primitives/hashes#sha256) -- [Schnorr signature verification](./cryptographic_primitives/schnorr) -- [Blake2s](./cryptographic_primitives/hashes#blake2s) -- [Blake3](./cryptographic_primitives/hashes#blake3) -- [Pedersen Hash](./cryptographic_primitives/hashes#pedersen_hash) -- [Pedersen Commitment](./cryptographic_primitives/hashes#pedersen_commitment) -- [ECDSA signature verification](./cryptographic_primitives/ecdsa_sig_verification) -- [Fixed base scalar multiplication](./cryptographic_primitives/scalar) +- [SHA256](./cryptographic_primitives/hashes.mdx#sha256) +- [Schnorr signature verification](./cryptographic_primitives/schnorr.mdx) +- [Blake2s](./cryptographic_primitives/hashes.mdx#blake2s) +- [Blake3](./cryptographic_primitives/hashes.mdx#blake3) +- [Pedersen Hash](./cryptographic_primitives/hashes.mdx#pedersen_hash) +- [Pedersen Commitment](./cryptographic_primitives/hashes.mdx#pedersen_commitment) +- [ECDSA signature verification](./cryptographic_primitives/ecdsa_sig_verification.mdx) +- [Fixed base scalar multiplication](./cryptographic_primitives/scalar.mdx) - AND - XOR - RANGE -- [Keccak256](./cryptographic_primitives/hashes#keccak256) +- [Keccak256](./cryptographic_primitives/hashes.mdx#keccak256) - [Recursive proof verification](./recursion) Most black box functions are included as part of the Noir standard library, however `AND`, `XOR` and `RANGE` are used as part of the Noir language syntax. For instance, using the bitwise operator `&` will invoke the `AND` black box function. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/noir/standard_library/black_box_fns.md index eae8744abf0..be8c65679c3 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/noir/standard_library/black_box_fns.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/noir/standard_library/black_box_fns.md @@ -12,18 +12,18 @@ The ACVM spec defines a set of blackbox functions which backends will be expecte Here is a list of the current black box functions: -- [SHA256](./cryptographic_primitives/hashes#sha256) -- [Schnorr signature verification](./cryptographic_primitives/schnorr) -- [Blake2s](./cryptographic_primitives/hashes#blake2s) -- [Blake3](./cryptographic_primitives/hashes#blake3) -- [Pedersen Hash](./cryptographic_primitives/hashes#pedersen_hash) -- [Pedersen Commitment](./cryptographic_primitives/hashes#pedersen_commitment) -- [ECDSA signature verification](./cryptographic_primitives/ecdsa_sig_verification) -- [Fixed base scalar multiplication](./cryptographic_primitives/scalar) +- [SHA256](./cryptographic_primitives/hashes.mdx#sha256) +- [Schnorr signature verification](./cryptographic_primitives/schnorr.mdx) +- [Blake2s](./cryptographic_primitives/hashes.mdx#blake2s) +- [Blake3](./cryptographic_primitives/hashes.mdx#blake3) +- [Pedersen Hash](./cryptographic_primitives/hashes.mdx#pedersen_hash) +- [Pedersen Commitment](./cryptographic_primitives/hashes.mdx#pedersen_commitment) +- [ECDSA signature verification](./cryptographic_primitives/ecdsa_sig_verification.mdx) +- [Fixed base scalar multiplication](./cryptographic_primitives/scalar.mdx) - AND - XOR - RANGE -- [Keccak256](./cryptographic_primitives/hashes#keccak256) +- [Keccak256](./cryptographic_primitives/hashes.mdx#keccak256) - [Recursive proof verification](./recursion) Most black box functions are included as part of the Noir standard library, however `AND`, `XOR` and `RANGE` are used as part of the Noir language syntax. For instance, using the bitwise operator `&` will invoke the `AND` black box function. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/.nojekyll b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/.nojekyll new file mode 100644 index 00000000000..e2ac6616add --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend.md new file mode 100644 index 00000000000..d60940df3ea --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend.md @@ -0,0 +1,127 @@ +# BarretenbergBackend + +## Implements + +- [`Backend`](../interfaces/Backend.md) + +## Constructors + +### new BarretenbergBackend(acirCircuit, options) + +```ts +new BarretenbergBackend(acirCircuit, options): BarretenbergBackend +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `acirCircuit` | [`CompiledCircuit`](../type-aliases/CompiledCircuit.md) | +| `options` | [`BackendOptions`](../type-aliases/BackendOptions.md) | + +#### Returns + +[`BarretenbergBackend`](BarretenbergBackend.md) + +## Methods + +### destroy() + +```ts +destroy(): Promise +``` + +#### Returns + +`Promise`\<`void`\> + +#### Implementation of + +[`Backend`](../interfaces/Backend.md).[`destroy`](../interfaces/Backend.md#destroy) + +#### Description + +Destroys the backend + +*** + +### generateProof() + +```ts +generateProof(compressedWitness): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `compressedWitness` | `Uint8Array` | + +#### Returns + +`Promise`\<[`ProofData`](../type-aliases/ProofData.md)\> + +#### Description + +Generates a proof + +*** + +### generateRecursiveProofArtifacts() + +```ts +generateRecursiveProofArtifacts(proofData, numOfPublicInputs): Promise +``` + +Generates artifacts that will be passed to a circuit that will verify this proof. + +Instead of passing the proof and verification key as a byte array, we pass them +as fields which makes it cheaper to verify in a circuit. + +The proof that is passed here will have been created using a circuit +that has the #[recursive] attribute on its `main` method. + +The number of public inputs denotes how many public inputs are in the inner proof. + +#### Parameters + +| Parameter | Type | Default value | +| :------ | :------ | :------ | +| `proofData` | [`ProofData`](../type-aliases/ProofData.md) | `undefined` | +| `numOfPublicInputs` | `number` | `0` | + +#### Returns + +`Promise`\<`object`\> + +#### Example + +```typescript +const artifacts = await backend.generateRecursiveProofArtifacts(proof, numOfPublicInputs); +``` + +*** + +### verifyProof() + +```ts +verifyProof(proofData): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | [`ProofData`](../type-aliases/ProofData.md) | + +#### Returns + +`Promise`\<`boolean`\> + +#### Description + +Verifies a proof + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/index.md new file mode 100644 index 00000000000..e32501acb71 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/index.md @@ -0,0 +1,46 @@ +# backend_barretenberg + +## Exports + +### Classes + +| Class | Description | +| :------ | :------ | +| [BarretenbergBackend](classes/BarretenbergBackend.md) | - | + +### Interfaces + +| Interface | Description | +| :------ | :------ | +| [Backend](interfaces/Backend.md) | - | + +### Type Aliases + +| Type alias | Description | +| :------ | :------ | +| [BackendOptions](type-aliases/BackendOptions.md) | - | +| [CompiledCircuit](type-aliases/CompiledCircuit.md) | - | +| [ProofData](type-aliases/ProofData.md) | - | + +## Functions + +### publicInputsToWitnessMap() + +```ts +publicInputsToWitnessMap(publicInputs, abi): WitnessMap +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `publicInputs` | `string`[] | +| `abi` | `Abi` | + +#### Returns + +`WitnessMap` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/interfaces/Backend.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/interfaces/Backend.md new file mode 100644 index 00000000000..3eb9645c8d2 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/interfaces/Backend.md @@ -0,0 +1,132 @@ +# Backend + +## Methods + +### destroy() + +```ts +destroy(): Promise +``` + +#### Returns + +`Promise`\<`void`\> + +#### Description + +Destroys the backend + +*** + +### generateFinalProof() + +```ts +generateFinalProof(decompressedWitness): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `decompressedWitness` | `Uint8Array` | + +#### Returns + +`Promise`\<[`ProofData`](../type-aliases/ProofData.md)\> + +#### Description + +Generates a final proof (not meant to be verified in another circuit) + +*** + +### generateIntermediateProof() + +```ts +generateIntermediateProof(decompressedWitness): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `decompressedWitness` | `Uint8Array` | + +#### Returns + +`Promise`\<[`ProofData`](../type-aliases/ProofData.md)\> + +#### Description + +Generates an intermediate proof (meant to be verified in another circuit) + +*** + +### generateIntermediateProofArtifacts() + +```ts +generateIntermediateProofArtifacts(proofData, numOfPublicInputs): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | [`ProofData`](../type-aliases/ProofData.md) | +| `numOfPublicInputs` | `number` | + +#### Returns + +`Promise`\<`object`\> + +#### Description + +Retrieves the artifacts from a proof in the Field format + +*** + +### verifyFinalProof() + +```ts +verifyFinalProof(proofData): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | [`ProofData`](../type-aliases/ProofData.md) | + +#### Returns + +`Promise`\<`boolean`\> + +#### Description + +Verifies a final proof + +*** + +### verifyIntermediateProof() + +```ts +verifyIntermediateProof(proofData): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | [`ProofData`](../type-aliases/ProofData.md) | + +#### Returns + +`Promise`\<`boolean`\> + +#### Description + +Verifies an intermediate proof + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions.md new file mode 100644 index 00000000000..b49a479f4f4 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions.md @@ -0,0 +1,21 @@ +# BackendOptions + +```ts +type BackendOptions: object; +``` + +## Description + +An options object, currently only used to specify the number of threads to use. + +## Type declaration + +| Member | Type | Description | +| :------ | :------ | :------ | +| `memory` | `object` | - | +| `memory.maximum` | `number` | - | +| `threads` | `number` | **Description**

Number of threads | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/CompiledCircuit.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/CompiledCircuit.md new file mode 100644 index 00000000000..34e0dd04205 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/CompiledCircuit.md @@ -0,0 +1,20 @@ +# CompiledCircuit + +```ts +type CompiledCircuit: object; +``` + +## Description + +The representation of a compiled circuit + +## Type declaration + +| Member | Type | Description | +| :------ | :------ | :------ | +| `abi` | `Abi` | **Description**

ABI representation of the circuit | +| `bytecode` | `string` | **Description**

The bytecode of the circuit | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/ProofData.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/ProofData.md new file mode 100644 index 00000000000..05cebbc4e94 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/type-aliases/ProofData.md @@ -0,0 +1,20 @@ +# ProofData + +```ts +type ProofData: object; +``` + +## Description + +The representation of a proof + +## Type declaration + +| Member | Type | Description | +| :------ | :------ | :------ | +| `proof` | `Uint8Array` | **Description**

An byte array representing the proof | +| `publicInputs` | `string`[] | **Description**

Public inputs of a proof | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/typedoc-sidebar.cjs b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/typedoc-sidebar.cjs new file mode 100644 index 00000000000..2aaa55bccf6 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/backend_barretenberg/typedoc-sidebar.cjs @@ -0,0 +1,4 @@ +// @ts-check +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const typedocSidebar = { items: [{"type":"category","label":"Classes","items":[{"type":"doc","id":"reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend","label":"BarretenbergBackend"}]},{"type":"category","label":"Interfaces","items":[{"type":"doc","id":"reference/NoirJS/backend_barretenberg/interfaces/Backend","label":"Backend"}]},{"type":"category","label":"Type Aliases","items":[{"type":"doc","id":"reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions","label":"BackendOptions"},{"type":"doc","id":"reference/NoirJS/backend_barretenberg/type-aliases/CompiledCircuit","label":"CompiledCircuit"},{"type":"doc","id":"reference/NoirJS/backend_barretenberg/type-aliases/ProofData","label":"ProofData"}]}]}; +module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/.nojekyll b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/.nojekyll new file mode 100644 index 00000000000..e2ac6616add --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/classes/Noir.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/classes/Noir.md new file mode 100644 index 00000000000..421d274fff8 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/classes/Noir.md @@ -0,0 +1,132 @@ +# Noir + +## Constructors + +### new Noir(circuit, backend) + +```ts +new Noir(circuit, backend?): Noir +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `circuit` | [`CompiledCircuit`](../type-aliases/CompiledCircuit.md) | +| `backend`? | `Backend` | + +#### Returns + +[`Noir`](Noir.md) + +## Methods + +### destroy() + +```ts +destroy(): Promise +``` + +#### Returns + +`Promise`\<`void`\> + +#### Description + +Destroys the underlying backend instance. + +#### Example + +```typescript +await noir.destroy(); +``` + +*** + +### execute() + +```ts +execute(inputs, foreignCallHandler?): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `inputs` | [`InputMap`](../type-aliases/InputMap.md) | +| `foreignCallHandler`? | [`ForeignCallHandler`](../type-aliases/ForeignCallHandler.md) | + +#### Returns + +`Promise`\<`object`\> + +#### Description + +Allows to execute a circuit to get its witness and return value. + +#### Example + +```typescript +async execute(inputs) +``` + +*** + +### generateProof() + +```ts +generateProof(inputs, foreignCallHandler?): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `inputs` | [`InputMap`](../type-aliases/InputMap.md) | +| `foreignCallHandler`? | [`ForeignCallHandler`](../type-aliases/ForeignCallHandler.md) | + +#### Returns + +`Promise`\<[`ProofData`](../type-aliases/ProofData.md)\> + +#### Description + +Generates a witness and a proof given an object as input. + +#### Example + +```typescript +async generateProof(input) +``` + +*** + +### verifyProof() + +```ts +verifyProof(proofData): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | [`ProofData`](../type-aliases/ProofData.md) | + +#### Returns + +`Promise`\<`boolean`\> + +#### Description + +Instantiates the verification key and verifies a proof. + +#### Example + +```typescript +async verifyProof(proof) +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/and.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/and.md new file mode 100644 index 00000000000..c783283e396 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/and.md @@ -0,0 +1,22 @@ +# and() + +```ts +and(lhs, rhs): string +``` + +Performs a bitwise AND operation between `lhs` and `rhs` + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `lhs` | `string` | | +| `rhs` | `string` | | + +## Returns + +`string` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/blake2s256.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/blake2s256.md new file mode 100644 index 00000000000..7882d0da8d5 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/blake2s256.md @@ -0,0 +1,21 @@ +# blake2s256() + +```ts +blake2s256(inputs): Uint8Array +``` + +Calculates the Blake2s256 hash of the input bytes + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `inputs` | `Uint8Array` | | + +## Returns + +`Uint8Array` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify.md new file mode 100644 index 00000000000..5e3cd53e9d3 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify.md @@ -0,0 +1,28 @@ +# ecdsa\_secp256k1\_verify() + +```ts +ecdsa_secp256k1_verify( + hashed_msg, + public_key_x_bytes, + public_key_y_bytes, + signature): boolean +``` + +Verifies a ECDSA signature over the secp256k1 curve. + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `hashed_msg` | `Uint8Array` | | +| `public_key_x_bytes` | `Uint8Array` | | +| `public_key_y_bytes` | `Uint8Array` | | +| `signature` | `Uint8Array` | | + +## Returns + +`boolean` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify.md new file mode 100644 index 00000000000..0b20ff68957 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify.md @@ -0,0 +1,28 @@ +# ecdsa\_secp256r1\_verify() + +```ts +ecdsa_secp256r1_verify( + hashed_msg, + public_key_x_bytes, + public_key_y_bytes, + signature): boolean +``` + +Verifies a ECDSA signature over the secp256r1 curve. + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `hashed_msg` | `Uint8Array` | | +| `public_key_x_bytes` | `Uint8Array` | | +| `public_key_y_bytes` | `Uint8Array` | | +| `signature` | `Uint8Array` | | + +## Returns + +`boolean` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/keccak256.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/keccak256.md new file mode 100644 index 00000000000..d10f155ce86 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/keccak256.md @@ -0,0 +1,21 @@ +# keccak256() + +```ts +keccak256(inputs): Uint8Array +``` + +Calculates the Keccak256 hash of the input bytes + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `inputs` | `Uint8Array` | | + +## Returns + +`Uint8Array` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/sha256.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/sha256.md new file mode 100644 index 00000000000..6ba4ecac022 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/sha256.md @@ -0,0 +1,21 @@ +# sha256() + +```ts +sha256(inputs): Uint8Array +``` + +Calculates the SHA256 hash of the input bytes + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `inputs` | `Uint8Array` | | + +## Returns + +`Uint8Array` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/xor.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/xor.md new file mode 100644 index 00000000000..8d762b895d3 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/functions/xor.md @@ -0,0 +1,22 @@ +# xor() + +```ts +xor(lhs, rhs): string +``` + +Performs a bitwise XOR operation between `lhs` and `rhs` + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `lhs` | `string` | | +| `rhs` | `string` | | + +## Returns + +`string` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/index.md new file mode 100644 index 00000000000..d600e21b299 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/index.md @@ -0,0 +1,37 @@ +# noir_js + +## Exports + +### Classes + +| Class | Description | +| :------ | :------ | +| [Noir](classes/Noir.md) | - | + +### Type Aliases + +| Type alias | Description | +| :------ | :------ | +| [CompiledCircuit](type-aliases/CompiledCircuit.md) | - | +| [ForeignCallHandler](type-aliases/ForeignCallHandler.md) | A callback which performs an foreign call and returns the response. | +| [ForeignCallInput](type-aliases/ForeignCallInput.md) | - | +| [ForeignCallOutput](type-aliases/ForeignCallOutput.md) | - | +| [InputMap](type-aliases/InputMap.md) | - | +| [ProofData](type-aliases/ProofData.md) | - | +| [WitnessMap](type-aliases/WitnessMap.md) | - | + +### Functions + +| Function | Description | +| :------ | :------ | +| [and](functions/and.md) | Performs a bitwise AND operation between `lhs` and `rhs` | +| [blake2s256](functions/blake2s256.md) | Calculates the Blake2s256 hash of the input bytes | +| [ecdsa\_secp256k1\_verify](functions/ecdsa_secp256k1_verify.md) | Verifies a ECDSA signature over the secp256k1 curve. | +| [ecdsa\_secp256r1\_verify](functions/ecdsa_secp256r1_verify.md) | Verifies a ECDSA signature over the secp256r1 curve. | +| [keccak256](functions/keccak256.md) | Calculates the Keccak256 hash of the input bytes | +| [sha256](functions/sha256.md) | Calculates the SHA256 hash of the input bytes | +| [xor](functions/xor.md) | Performs a bitwise XOR operation between `lhs` and `rhs` | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/CompiledCircuit.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/CompiledCircuit.md new file mode 100644 index 00000000000..34e0dd04205 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/CompiledCircuit.md @@ -0,0 +1,20 @@ +# CompiledCircuit + +```ts +type CompiledCircuit: object; +``` + +## Description + +The representation of a compiled circuit + +## Type declaration + +| Member | Type | Description | +| :------ | :------ | :------ | +| `abi` | `Abi` | **Description**

ABI representation of the circuit | +| `bytecode` | `string` | **Description**

The bytecode of the circuit | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md new file mode 100644 index 00000000000..812b8b16481 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md @@ -0,0 +1,24 @@ +# ForeignCallHandler + +```ts +type ForeignCallHandler: (name, inputs) => Promise; +``` + +A callback which performs an foreign call and returns the response. + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `name` | `string` | The identifier for the type of foreign call being performed. | +| `inputs` | [`ForeignCallInput`](ForeignCallInput.md)[] | An array of hex encoded inputs to the foreign call. | + +## Returns + +`Promise`\<[`ForeignCallOutput`](ForeignCallOutput.md)[]\> + +outputs - An array of hex encoded outputs containing the results of the foreign call. + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallInput.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallInput.md new file mode 100644 index 00000000000..dd95809186a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallInput.md @@ -0,0 +1,9 @@ +# ForeignCallInput + +```ts +type ForeignCallInput: string[]; +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallOutput.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallOutput.md new file mode 100644 index 00000000000..b71fb78a946 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ForeignCallOutput.md @@ -0,0 +1,9 @@ +# ForeignCallOutput + +```ts +type ForeignCallOutput: string | string[]; +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/InputMap.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/InputMap.md new file mode 100644 index 00000000000..c714e999d93 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/InputMap.md @@ -0,0 +1,13 @@ +# InputMap + +```ts +type InputMap: object; +``` + +## Index signature + + \[`key`: `string`\]: `InputValue` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ProofData.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ProofData.md new file mode 100644 index 00000000000..05cebbc4e94 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/ProofData.md @@ -0,0 +1,20 @@ +# ProofData + +```ts +type ProofData: object; +``` + +## Description + +The representation of a proof + +## Type declaration + +| Member | Type | Description | +| :------ | :------ | :------ | +| `proof` | `Uint8Array` | **Description**

An byte array representing the proof | +| `publicInputs` | `string`[] | **Description**

Public inputs of a proof | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/WitnessMap.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/WitnessMap.md new file mode 100644 index 00000000000..258c46f9d0c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/type-aliases/WitnessMap.md @@ -0,0 +1,9 @@ +# WitnessMap + +```ts +type WitnessMap: Map; +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/typedoc-sidebar.cjs b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/typedoc-sidebar.cjs new file mode 100644 index 00000000000..fe2629ddc9f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_js/typedoc-sidebar.cjs @@ -0,0 +1,4 @@ +// @ts-check +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const typedocSidebar = { items: [{"type":"category","label":"Classes","items":[{"type":"doc","id":"reference/NoirJS/noir_js/classes/Noir","label":"Noir"}]},{"type":"category","label":"Type Aliases","items":[{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/CompiledCircuit","label":"CompiledCircuit"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/ForeignCallHandler","label":"ForeignCallHandler"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/ForeignCallInput","label":"ForeignCallInput"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/ForeignCallOutput","label":"ForeignCallOutput"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/InputMap","label":"InputMap"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/ProofData","label":"ProofData"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/WitnessMap","label":"WitnessMap"}]},{"type":"category","label":"Functions","items":[{"type":"doc","id":"reference/NoirJS/noir_js/functions/and","label":"and"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/blake2s256","label":"blake2s256"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify","label":"ecdsa_secp256k1_verify"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify","label":"ecdsa_secp256r1_verify"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/keccak256","label":"keccak256"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/sha256","label":"sha256"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/xor","label":"xor"}]}]}; +module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/.nojekyll b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/.nojekyll new file mode 100644 index 00000000000..e2ac6616add --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/compile.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/compile.md new file mode 100644 index 00000000000..6faf763b37f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/compile.md @@ -0,0 +1,51 @@ +# compile() + +```ts +compile( + fileManager, + projectPath?, + logFn?, +debugLogFn?): Promise +``` + +Compiles a Noir project + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `fileManager` | `FileManager` | The file manager to use | +| `projectPath`? | `string` | The path to the project inside the file manager. Defaults to the root of the file manager | +| `logFn`? | `LogFn` | A logging function. If not provided, console.log will be used | +| `debugLogFn`? | `LogFn` | A debug logging function. If not provided, logFn will be used | + +## Returns + +`Promise`\<[`ProgramCompilationArtifacts`](../index.md#programcompilationartifacts)\> + +## Example + +```typescript +// Node.js + +import { compile_program, createFileManager } from '@noir-lang/noir_wasm'; + +const fm = createFileManager(myProjectPath); +const myCompiledCode = await compile_program(fm); +``` + +```typescript +// Browser + +import { compile_program, createFileManager } from '@noir-lang/noir_wasm'; + +const fm = createFileManager('/'); +for (const path of files) { + await fm.writeFile(path, await getFileAsStream(path)); +} +const myCompiledCode = await compile_program(fm); +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/compile_contract.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/compile_contract.md new file mode 100644 index 00000000000..7d0b39a43ef --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/compile_contract.md @@ -0,0 +1,51 @@ +# compile\_contract() + +```ts +compile_contract( + fileManager, + projectPath?, + logFn?, +debugLogFn?): Promise +``` + +Compiles a Noir project + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `fileManager` | `FileManager` | The file manager to use | +| `projectPath`? | `string` | The path to the project inside the file manager. Defaults to the root of the file manager | +| `logFn`? | `LogFn` | A logging function. If not provided, console.log will be used | +| `debugLogFn`? | `LogFn` | A debug logging function. If not provided, logFn will be used | + +## Returns + +`Promise`\<[`ContractCompilationArtifacts`](../index.md#contractcompilationartifacts)\> + +## Example + +```typescript +// Node.js + +import { compile_contract, createFileManager } from '@noir-lang/noir_wasm'; + +const fm = createFileManager(myProjectPath); +const myCompiledCode = await compile_contract(fm); +``` + +```typescript +// Browser + +import { compile_contract, createFileManager } from '@noir-lang/noir_wasm'; + +const fm = createFileManager('/'); +for (const path of files) { + await fm.writeFile(path, await getFileAsStream(path)); +} +const myCompiledCode = await compile_contract(fm); +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/createFileManager.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/createFileManager.md new file mode 100644 index 00000000000..7e65c1d69c7 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/createFileManager.md @@ -0,0 +1,21 @@ +# createFileManager() + +```ts +createFileManager(dataDir): FileManager +``` + +Creates a new FileManager instance based on fs in node and memfs in the browser (via webpack alias) + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `dataDir` | `string` | root of the file system | + +## Returns + +`FileManager` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/inflateDebugSymbols.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/inflateDebugSymbols.md new file mode 100644 index 00000000000..fcea9275341 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/functions/inflateDebugSymbols.md @@ -0,0 +1,21 @@ +# inflateDebugSymbols() + +```ts +inflateDebugSymbols(debugSymbols): any +``` + +Decompresses and decodes the debug symbols + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `debugSymbols` | `string` | The base64 encoded debug symbols | + +## Returns + +`any` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/index.md new file mode 100644 index 00000000000..b6e0f9d1bc0 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/index.md @@ -0,0 +1,49 @@ +# noir_wasm + +## Exports + +### Functions + +| Function | Description | +| :------ | :------ | +| [compile](functions/compile.md) | Compiles a Noir project | +| [compile\_contract](functions/compile_contract.md) | Compiles a Noir project | +| [createFileManager](functions/createFileManager.md) | Creates a new FileManager instance based on fs in node and memfs in the browser (via webpack alias) | +| [inflateDebugSymbols](functions/inflateDebugSymbols.md) | Decompresses and decodes the debug symbols | + +## References + +### compile\_program + +Renames and re-exports [compile](functions/compile.md) + +## Interfaces + +### ContractCompilationArtifacts + +The compilation artifacts of a given contract. + +#### Properties + +| Property | Type | Description | +| :------ | :------ | :------ | +| `contract` | `ContractArtifact` | The compiled contract. | +| `warnings` | `unknown`[] | Compilation warnings. | + +*** + +### ProgramCompilationArtifacts + +The compilation artifacts of a given program. + +#### Properties + +| Property | Type | Description | +| :------ | :------ | :------ | +| `name` | `string` | not part of the compilation output, injected later | +| `program` | `ProgramArtifact` | The compiled contract. | +| `warnings` | `unknown`[] | Compilation warnings. | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/typedoc-sidebar.cjs b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/typedoc-sidebar.cjs new file mode 100644 index 00000000000..e0870710349 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.25.0/reference/NoirJS/noir_wasm/typedoc-sidebar.cjs @@ -0,0 +1,4 @@ +// @ts-check +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const typedocSidebar = { items: [{"type":"doc","id":"reference/NoirJS/noir_wasm/index","label":"API"},{"type":"category","label":"Functions","items":[{"type":"doc","id":"reference/NoirJS/noir_wasm/functions/compile","label":"compile"},{"type":"doc","id":"reference/NoirJS/noir_wasm/functions/compile_contract","label":"compile_contract"},{"type":"doc","id":"reference/NoirJS/noir_wasm/functions/createFileManager","label":"createFileManager"},{"type":"doc","id":"reference/NoirJS/noir_wasm/functions/inflateDebugSymbols","label":"inflateDebugSymbols"}]}]}; +module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/noir/noir-repo/noir_stdlib/src/array.nr b/noir/noir-repo/noir_stdlib/src/array.nr index baa4bef50cc..8a8a1fad01c 100644 --- a/noir/noir-repo/noir_stdlib/src/array.nr +++ b/noir/noir-repo/noir_stdlib/src/array.nr @@ -52,14 +52,8 @@ impl [T; N] { result } - // Converts an array into a slice. - pub fn as_slice(self) -> [T] { - let mut slice = []; - for elem in self { - slice = slice.push_back(elem); - } - slice - } + #[builtin(as_slice)] + pub fn as_slice(self) -> [T] {} // Apply a function to each element of an array, returning a new array // containing the mapped elements. diff --git a/noir/noir-repo/noir_stdlib/src/field/bn254.nr b/noir/noir-repo/noir_stdlib/src/field/bn254.nr index 9e1445fd3ba..765f8a9d849 100644 --- a/noir/noir-repo/noir_stdlib/src/field/bn254.nr +++ b/noir/noir-repo/noir_stdlib/src/field/bn254.nr @@ -101,3 +101,81 @@ pub fn gt(a: Field, b: Field) -> bool { pub fn lt(a: Field, b: Field) -> bool { gt(b, a) } + +mod tests { + // TODO: Allow imports from "super" + use crate::field::bn254::{decompose_unsafe, decompose, lt_unsafe, assert_gt, gt, lt, TWO_POW_128, lte_unsafe, PLO, PHI}; + + #[test] + fn check_decompose_unsafe() { + assert_eq(decompose_unsafe(TWO_POW_128), (0, 1)); + assert_eq(decompose_unsafe(TWO_POW_128 + 0x1234567890), (0x1234567890, 1)); + assert_eq(decompose_unsafe(0x1234567890), (0x1234567890, 0)); + } + + #[test] + fn check_decompose() { + assert_eq(decompose(TWO_POW_128), (0, 1)); + assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1)); + assert_eq(decompose(0x1234567890), (0x1234567890, 0)); + } + + #[test] + fn check_lt_unsafe() { + assert(lt_unsafe(0, 1, 16)); + assert(lt_unsafe(0, 0x100, 16)); + assert(lt_unsafe(0x100, TWO_POW_128 - 1, 16)); + assert(!lt_unsafe(0, TWO_POW_128, 16)); + } + + #[test] + fn check_lte_unsafe() { + assert(lte_unsafe(0, 1, 16)); + assert(lte_unsafe(0, 0x100, 16)); + assert(lte_unsafe(0x100, TWO_POW_128 - 1, 16)); + assert(!lte_unsafe(0, TWO_POW_128, 16)); + + assert(lte_unsafe(0, 0, 16)); + assert(lte_unsafe(0x100, 0x100, 16)); + assert(lte_unsafe(TWO_POW_128 - 1, TWO_POW_128 - 1, 16)); + assert(lte_unsafe(TWO_POW_128, TWO_POW_128, 16)); + } + + #[test] + fn check_assert_gt() { + assert_gt(1, 0); + assert_gt(0x100, 0); + assert_gt((0 - 1), (0 - 2)); + assert_gt(TWO_POW_128, 0); + assert_gt(0 - 1, 0); + } + + #[test] + fn check_gt() { + assert(gt(1, 0)); + assert(gt(0x100, 0)); + assert(gt((0 - 1), (0 - 2))); + assert(gt(TWO_POW_128, 0)); + assert(!gt(0, 0)); + assert(!gt(0, 0x100)); + assert(gt(0 - 1, 0 - 2)); + assert(!gt(0 - 2, 0 - 1)); + } + + #[test] + fn check_plo_phi() { + assert_eq(PLO + PHI * TWO_POW_128, 0); + let p_bytes = crate::field::modulus_le_bytes(); + let mut p_low: Field = 0; + let mut p_high: Field = 0; + + let mut offset = 1; + for i in 0..16 { + p_low += (p_bytes[i] as Field) * offset; + p_high += (p_bytes[i + 16] as Field) * offset; + offset *= 256; + } + assert_eq(p_low, PLO); + assert_eq(p_high, PHI); + } +} diff --git a/noir/noir-repo/noir_stdlib/src/option.nr b/noir/noir-repo/noir_stdlib/src/option.nr index 1c32f758af7..c94a1cf836e 100644 --- a/noir/noir-repo/noir_stdlib/src/option.nr +++ b/noir/noir-repo/noir_stdlib/src/option.nr @@ -1,3 +1,7 @@ +use crate::hash::{Hash, Hasher}; +use crate::cmp::{Ordering, Ord, Eq}; +use crate::default::Default; + struct Option { _is_some: bool, _value: T, @@ -152,3 +156,51 @@ impl Option { } } } + +impl Default for Option { + fn default() -> Self { + Option::none() + } +} + +impl Eq for Option where T: Eq { + fn eq(self, other: Self) -> bool { + if self._is_some == other._is_some { + if self._is_some { + self._value == other._value + } else { + true + } + } else { + false + } + } +} + +impl Hash for Option where T: Hash { + fn hash(self, state: &mut H) where H: Hasher { + self._is_some.hash(state); + if self._is_some { + self._value.hash(state); + } + } +} + +// For this impl we're declaring Option::none < Option::some +impl Ord for Option where T: Ord { + fn cmp(self, other: Self) -> Ordering { + if self._is_some { + if other._is_some { + self._value.cmp(other._value) + } else { + Ordering::greater() + } + } else { + if other._is_some { + Ordering::less() + } else { + Ordering::equal() + } + } + } +} diff --git a/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/Nargo.toml b/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/Nargo.toml deleted file mode 100644 index e8b06655c58..00000000000 --- a/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/Nargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "field_comparisons" -type = "bin" -authors = [""] - -[dependencies] diff --git a/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/Prover.toml b/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/Prover.toml deleted file mode 100644 index 8b137891791..00000000000 --- a/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/Prover.toml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/src/main.nr b/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/src/main.nr deleted file mode 100644 index 48cca6c89fc..00000000000 --- a/noir/noir-repo/test_programs/compile_success_empty/field_comparisons/src/main.nr +++ /dev/null @@ -1,86 +0,0 @@ -use dep::std::field::bn254::{PLO, PHI, TWO_POW_128, decompose, decompose_unsafe, lt_unsafe, lte_unsafe, assert_gt, gt}; - -fn check_plo_phi() { - assert_eq(PLO + PHI * TWO_POW_128, 0); - let p_bytes = dep::std::field::modulus_le_bytes(); - let mut p_low: Field = 0; - let mut p_high: Field = 0; - - let mut offset = 1; - for i in 0..16 { - p_low += (p_bytes[i] as Field) * offset; - p_high += (p_bytes[i + 16] as Field) * offset; - offset *= 256; - } - assert_eq(p_low, PLO); - assert_eq(p_high, PHI); -} - -fn check_decompose_unsafe() { - assert_eq(decompose_unsafe(TWO_POW_128), (0, 1)); - assert_eq(decompose_unsafe(TWO_POW_128 + 0x1234567890), (0x1234567890, 1)); - assert_eq(decompose_unsafe(0x1234567890), (0x1234567890, 0)); -} - -fn check_decompose() { - assert_eq(decompose(TWO_POW_128), (0, 1)); - assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1)); - assert_eq(decompose(0x1234567890), (0x1234567890, 0)); -} - -fn check_lt_unsafe() { - assert(lt_unsafe(0, 1, 16)); - assert(lt_unsafe(0, 0x100, 16)); - assert(lt_unsafe(0x100, TWO_POW_128 - 1, 16)); - assert(!lt_unsafe(0, TWO_POW_128, 16)); -} - -fn check_lte_unsafe() { - assert(lte_unsafe(0, 1, 16)); - assert(lte_unsafe(0, 0x100, 16)); - assert(lte_unsafe(0x100, TWO_POW_128 - 1, 16)); - assert(!lte_unsafe(0, TWO_POW_128, 16)); - - assert(lte_unsafe(0, 0, 16)); - assert(lte_unsafe(0x100, 0x100, 16)); - assert(lte_unsafe(TWO_POW_128 - 1, TWO_POW_128 - 1, 16)); - assert(lte_unsafe(TWO_POW_128, TWO_POW_128, 16)); -} - -fn check_assert_gt() { - assert_gt(1, 0); - assert_gt(0x100, 0); - assert_gt((0 - 1), (0 - 2)); - assert_gt(TWO_POW_128, 0); - assert_gt(0 - 1, 0); -} - -fn check_gt() { - assert(gt(1, 0)); - assert(gt(0x100, 0)); - assert(gt((0 - 1), (0 - 2))); - assert(gt(TWO_POW_128, 0)); - assert(!gt(0, 0)); - assert(!gt(0, 0x100)); - assert(gt(0 - 1, 0 - 2)); - assert(!gt(0 - 2, 0 - 1)); -} - -fn checks() { - check_plo_phi(); - check_decompose_unsafe(); - check_decompose(); - check_lt_unsafe(); - check_lte_unsafe(); - check_assert_gt(); - check_gt(); -} - -unconstrained fn checks_in_brillig() { - checks(); -} - -fn main() { - checks(); - checks_in_brillig(); -} diff --git a/noir/noir-repo/test_programs/execution_success/array_to_slice/Nargo.toml b/noir/noir-repo/test_programs/execution_success/array_to_slice/Nargo.toml new file mode 100644 index 00000000000..90c67b07b2b --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/array_to_slice/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "array_to_slice" +type = "bin" +authors = [""] +compiler_version = ">=0.24.0" + +[dependencies] \ No newline at end of file diff --git a/noir/noir-repo/test_programs/execution_success/array_to_slice/Prover.toml b/noir/noir-repo/test_programs/execution_success/array_to_slice/Prover.toml new file mode 100644 index 00000000000..26fdbc19975 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/array_to_slice/Prover.toml @@ -0,0 +1,2 @@ +x = "0" +y = "1" diff --git a/noir/noir-repo/test_programs/execution_success/array_to_slice/src/main.nr b/noir/noir-repo/test_programs/execution_success/array_to_slice/src/main.nr new file mode 100644 index 00000000000..4f5594c6d11 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/array_to_slice/src/main.nr @@ -0,0 +1,33 @@ +// Converts an array into a slice. +fn as_slice_push(xs: [T; N]) -> [T] { + let mut slice = []; + for elem in xs { + slice = slice.push_back(elem); + } + slice +} + +fn main(x: Field, y: pub Field) { + let xs: [Field; 0] = []; + let ys: [Field; 1] = [1]; + let zs: [Field; 2] = [1, 2]; + let ws: [Field; 3] = [1; 3]; + let qs: [Field; 4] = [3, 2, 1, 0]; + + let mut dynamic: [Field; 4] = [3, 2, 1, 0]; + let dynamic_expected: [Field; 4] = [1000, 2, 1, 0]; + dynamic[x] = 1000; + + assert(x != y); + assert(xs.as_slice() == as_slice_push(xs)); + assert(ys.as_slice() == as_slice_push(ys)); + assert(zs.as_slice() == as_slice_push(zs)); + assert(ws.as_slice() == as_slice_push(ws)); + assert(qs.as_slice() == as_slice_push(qs)); + + assert(dynamic.as_slice()[0] == dynamic_expected[0]); + assert(dynamic.as_slice()[1] == dynamic_expected[1]); + assert(dynamic.as_slice()[2] == dynamic_expected[2]); + assert(dynamic.as_slice()[3] == dynamic_expected[3]); + assert(dynamic.as_slice().len() == 4); +} diff --git a/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/Nargo.toml b/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/Nargo.toml new file mode 100644 index 00000000000..58157c38c26 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "brillig_array_to_slice" +type = "bin" +authors = [""] +compiler_version = ">=0.25.0" + +[dependencies] \ No newline at end of file diff --git a/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/Prover.toml b/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/Prover.toml new file mode 100644 index 00000000000..11497a473bc --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/Prover.toml @@ -0,0 +1 @@ +x = "0" diff --git a/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/src/main.nr b/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/src/main.nr new file mode 100644 index 00000000000..8f7fcf24bae --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/brillig_array_to_slice/src/main.nr @@ -0,0 +1,18 @@ +unconstrained fn brillig_as_slice(x: Field) -> (u64, Field, Field) { + let mut dynamic: [Field; 1] = [1]; + dynamic[x] = 2; + assert(dynamic[0] == 2); + + let brillig_slice = dynamic.as_slice(); + assert(brillig_slice.len() == 1); + + (brillig_slice.len(), dynamic[0], brillig_slice[0]) +} + +fn main(x: Field) { + let (slice_len, dynamic_0, slice_0) = brillig_as_slice(x); + assert(slice_len == 1); + assert(dynamic_0 == 2); + assert(slice_0 == 2); +} + diff --git a/noir/noir-repo/tooling/nargo_cli/tests/stdlib-tests.rs b/noir/noir-repo/tooling/nargo_cli/tests/stdlib-tests.rs new file mode 100644 index 00000000000..9d377cfaee9 --- /dev/null +++ b/noir/noir-repo/tooling/nargo_cli/tests/stdlib-tests.rs @@ -0,0 +1,62 @@ +use std::{collections::BTreeMap, path::PathBuf}; + +use acvm::blackbox_solver::StubbedBlackBoxSolver; +use noirc_driver::{check_crate, file_manager_with_stdlib, CompileOptions}; +use noirc_frontend::hir::FunctionNameMatch; + +use nargo::{ + ops::{report_errors, run_test, TestStatus}, + package::{Package, PackageType}, + parse_all, prepare_package, +}; + +#[test] +fn stdlib_noir_tests() { + let mut file_manager = file_manager_with_stdlib(&PathBuf::from(".")); + file_manager.add_file_with_source_canonical_path(&PathBuf::from("main.nr"), "".to_owned()); + let parsed_files = parse_all(&file_manager); + + // We need a dummy package as we cannot compile the stdlib on its own. + let dummy_package = Package { + version: None, + compiler_required_version: None, + root_dir: PathBuf::from("."), + package_type: PackageType::Binary, + entry_path: PathBuf::from("main.nr"), + name: "dummy".parse().unwrap(), + dependencies: BTreeMap::new(), + }; + + let (mut context, dummy_crate_id) = + prepare_package(&file_manager, &parsed_files, &dummy_package); + + let result = check_crate(&mut context, dummy_crate_id, true, false); + report_errors(result, &context.file_manager, true, false) + .expect("Error encountered while compiling standard library"); + + // We can now search within the stdlib for any test functions to compile. + + let test_functions = context.get_all_test_functions_in_crate_matching( + context.stdlib_crate_id(), + FunctionNameMatch::Anything, + ); + + let test_report: Vec<(String, TestStatus)> = test_functions + .into_iter() + .map(|(test_name, test_function)| { + let status = run_test( + &StubbedBlackBoxSolver, + &mut context, + &test_function, + false, + None, + &CompileOptions::default(), + ); + + (test_name, status) + }) + .collect(); + + assert!(!test_report.is_empty(), "Could not find any tests within the stdlib"); + assert!(test_report.iter().all(|(_, status)| !status.failed())); +} diff --git a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap index 524a933f3f0..a6189d1aeb6 100644 --- a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap +++ b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap @@ -9,18 +9,18 @@ exports[`ContractClass creates a contract class from a contract compilation arti "selector": { "value": 2381782501 }, - "bytecode": "0x1f8b08000000000000ffed9d779c1545baf77b6008726644cc6b1c4ca8280e87cc0c3098136614111186610405862866d435908339820425670105258961734e6ed275dd74efddddcffbc77def7d83efdb754e3d3bbf29ab0f73c6aec3efcca9fe7c6a4ef533d5fd7cebd74f57a7eaae7f06415014a4a796613a23f8ea24ffafd2bfe55f6fea1ae3baca5d7216e509678b3ce16c99279cc579c2d92a4f385be709679b3ce16c9b279c87c5c8a9d85a040da7b879db39d0356ec6449e695a92079a96e699a687e781a6ed83fc68a38ec813ce0e79c279649e701e95279c47e709e73179c2796c9e701e97279cc7e709e737f284f3843ce13c314f384fca13ce93f384f3943ce13c354f38cbf284b3639e709e96279ca7e709e71979c279669e709e15236767e0eca47fcfd6bfe7e8df73f5af943d4fff9eaf7fbbe83a16ebf90b145798d4439aa4f1bf6e61ea1ea61e61ea69fcaf57987a87a94f98faeaff95e9ff5584a9324cfdc2d43f4c03b40603c37461982e0ad3c561ba244c9786e9b2305d1ea62bc2746598ae0ad3d5611a14a66bc2746d98ae0bd3f561ba214c3786e9a6300d0ed3cd61ba254c43c2746b98861a2cb7856958986e0fd3f030dd11a611611a19a6ea308d0a534d984687a9364c7786694c98c686e9ae30dd1da671611a1fa60961aa0bd3c4304d0ad3e4304d09d3d4304d0bd33d619a1ea67bc3745f98ee37347b204c0f86e9a1303d6c70ce08d323617a344c8f85e99b617a3c4c4f84e9c9303d15a699619a15a6d9619a13a6b9619a17a6f9615a10a685615a14a6a7c3f44c989e0dd373617a3e4c2f84e9c530bd14a697c3f44a985e0dd36b615aac5964475812a6d7c3b4344ccbc2b43c4c2bc2f44698de0cd3ca30ad0ad3ea30ad09d3da30ad0bd3fa306d08d3c6306d0ad3e6306d09d3d630bd15a66d61da1ea61d617a3b4cef846967987685e9dd30bd17a6dd61da13a6bd61da17a6fd617a3f4c07c2f441983e0cd34761fa384cdf0ad3b7c3f49d307d374cdf0bd3f70dcd7f10a61f86e94761fab1b6fd44fffe549795fb773f0bd3cf75fe17faf797faf757faf71363995f87e93786edb761fa9d61fb7d983ed5f9cff4ef1ff4efe7faf78ffaf70bfdfb27fdfb67fdfb17fdfb57fdfb37fdfb6ffaf7dff5ef7fe8dfbfebdf7fe8df7f86696bc774be6d503f550531b551dd6b53cf7e44fc4e41c34969d152ff4f7ecbb4bd58cfcbaf68d74acfb732ecadf57c6b633d6df57c5bc3de41cf7730ec47e9f9a30cfb317afe18c37e9c9e3fceb09fa1e7cf007b22807bc3daae6c2db5a9086c12af2dc0d64adb5a82adb5ac0e6c6db4ad15d864fbb606db61dad6066cedb4ad2dd812da76986819a6126dab0ae28a95f2916abda571af573f2f3b3c7ede516abded1df11e113fef68b5de0e0e78557c1ca9d77504c4cd51dad6016c476bdb91603b46db8e02dbb1da7634d88ed3b663c076bcb61d0bb66f68db71603b41db8e07db89daf60db09da46d2780ed646d3b116ca768db49603b55db4e065b99b69d0236dde406a782ed346d2b03dbe9dad6116c6768db69603b53db4e07db59da7606d8a4fd3d136c72be7896b6a9b6e3b0225846dba5dd4a2d236d36d8ce91f61a6ce74a5b0db6ced24e83ed3cf02db6f3a1ad115b176d93764bfdafafce570571ed27c95ab5de8ab8d71bae59adb75ffceb4d3d73ec1fd4eb5a057e2a40ab013a1f63bfa6aee8bb4827f123f662c85f0965a59ce821c71e6157c7984a9d1f9061b9bec672a550a6d252ffaa20defaf73378fa19ccad20ef2666bb75f331dbe829eb981d0265cdd893f3a0e618b38380c341ccf6f231dbe829eb98ad85b266ecc9b970738cd9db80c341cc56bb89d964b98fd9f47db320b0c79e5c0f35c7981d0b1cf1c76c0f1fb38d9fb28ed9c7a0ac197b724ddc1c63763a70c41fb3bdaafdb941a3a7ac6376219435634feecf34c7987d02381cc46cad6f671b3d651db38ba1ac197b72afb039c6ec33c0117fccf67114b3dd7ccc06e967a041608f3db96fdd1c63762970c41fb3a3fcfdd9c64f59c7ec4e286bc69e3c43698e31bb51e7d573869fe8e70c2781eda7da7632f0c61fdb353d1cc576d2c776ba6f4810d863549ee735c7d8dea3f32a8e7f01fd11c4f64b6deb08b65f69db6960fb44db4e877a39d807aafd3ed0e829eb7de03750d68c6579b6dc1cf7811f01878398adf131dbe829eb98fd1b9435634ffa3934c798fd3d703888d95a1fb38d9eb28ed9ff82b266ec9dadf3cd3166a5afa93a5ff84c9f2f9c0bb63f685b67b07dae6de781ed8fda763ed8bed0b62e60fb93b65d00b63f6b5b39d8fea26d5dc1f6576d4b82ed6fdad60d6cffa66dddc1f6efdad6036cffa16d3dc1f6776deb05b67f685b6fb0fd53dbfa689b7ade257dafe4bcb52df05705f16e5be97729eb96f9ae39f0dddef0dd3e87be3b18be3b587c271df84e800f998a8cf92ac827ddf29497020ffaea1ebfaf6eaaeedd82c6d7bd3bf0f47050f704f8680c4f0fe0e9193f4faaff6faff8d79bdac6dd0c4d13e0ab1bd4abb7837a15812f59b7cc8bbf52b061dbdadbc2d8277ec66411f89275cb7c1f60141bb6f5f2ce95ec3fea78d8a9a89ed7c1be943a27427f55c021fe8aa1cc151debcb76d66c25f07f3ceef5346c8ee2321517e24bd62df3e2af04ead333f78cc9c632f630185db51145e04bd6ed7dd76f07c9e371dcc1b58eb54d13df1539f0ddc7f0ddddf08d6da74c998e6d7d8039f66b4e7d6cab8c7fbde5787d22d786e207cf1ff01a2eae3aa16fb936143f622f86fc3545f565a59ce821edb0b0ab58966d89ece672bd8de54aa14c85a5fe5541bcf5af34782a0d6675bcb9088e850ef687540c54181c32df1db4ab8cd0ae02b49332678376aedab3be068fccf7041e69c77a018fab6ba2289e5c5c8f1dcc379ec3e2f5b3fc1fcf035c6dafae06a3ccdbb6571f60b49dab38b89ec978aed20318c5d61778ba39d22c6abb7623f1ed205652ed91f8907373d97fc55f3194e9d3b2beec5dd056ba88118c47991a7bcd1bff764aa6aec17b64c183dbcec175555747f1588ef76fbe0ce28d35b35dea616815758fc7555bdecde09179f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f199f2761bf2d29d79384d1ecffe6ea3e7feafb877a5df80ce87f3bed0f962cc7fe31d20fe25ca3cec550a6b4453ddbff83fe60e6732aec23d9d3ad76a96d89fd31ab605efc615f2bdc960cfd9dca62f39d1ce5ea799bfa0698fa8ea6d9f7b3a7455317fd9f51d3224353ec8f7f9ec1a3e2b4b2653d9b8b677fd93e8b44ad241fe7b3bdd2c01eebf16f97648367d62d8286ed071e675cf5df91b65a9e975718be8ba1cc892deab70df6b3aa823ac872d8ef47d62dcb9c0bcb561aeb6eaf97158ed6c6fa7bc1b252e6146853f7b5a8d7cc415b99ccb6ef3a3e378fff389c7e8edf2d0b9eaec0e3a29d7174be518efb40dccff1cdfe69b6f31829837dfb1cf4abccd8df49fc7966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563ce6b3567cbfb63b09638efa3ea49e67c8b7caf0d9d4c616f57e5d3f8793674e9d8d3ae3bba3ff6c51cfb655e74b82aff67788da96aebe4f11b52dc51f7e7b069f05b978ae5b04be64dd498b16922f8bcd77fa39be8bb121e4397e3743d7ee164d5dedaff88c1535c5fdb587c183cf46a3beed93346c2efb0e45c585f8c37d290936c9e3fbd12eb6331e4bcc7e3de20f9f5f7f476bdb3e70b5ed93e52edb0d79362fcfeabb59ea2a657e086ddf8f751efb7060df91cf2cff9729d3736ad14fd5d9c1f735cb8b605db27d6ddff61c08ac31f9ee8aeb2ad269a0a14131e43f6d515f56ca4959d15ad8d53e22df80417673b91ec672a550a6bfa5fe5541bcf537bfb53ac06056b1f33388b3cfe0f8efaa4dea1fa1d1b9a0919471fccd466bff4ab35f21b6a36d8c32b22c7e8beeafd04645f51fb51d031c7c5b38e33100bfb76b1e171ad3cfb3d0fb69fd37b41771f7d3fa6f8821eca71518ebef0ceb17ae3641f4b145cafc5f63fde639b92c83fdc0feb59fc0f75c923a9fcd39f9a1babeb29d93e3725175c77d33eee313c604b2603c4999765a6bd9669511dc7d2ccb96462c2b5a99df0a2b09beaa9f9befaca5f7f901465d24aef11be452e628a88b9bf396f439a0ab6fcac9baa41d485aea2a658e877ded049d4fc076c2b6f91ccbff65ca740e8863b85f187f9d53dbf722bd2ed9be175a7c5f0cac31f9ee8abee51c50fc88bd18f267b7ac2f2be5440fd15ad8d53e22e751c86e2e57612c570a65065aea5f15c45bff0b0d9e0b0d66153b27439c9d03fdd05db5d5032334ea0c1a4919bca768fb0ea8ed5e87abf737a2cea5f0fd25f33e011e27dd9c37d9cf63cdfb6ab67384ce063f9e23f482763661296bde2f94e3659cfd86f15d895ee017df9570f5ede6bea05b15cce379c1a1f4ede23bb6ca5fd498097d73e03b6acc845cf8ee60f8ee9043df5e73af3993e60ec62048bd7f86df2c5553a6f3521c9740966b018c2ec67248040dbf3d7e30461cdf41966b098c2e8e0fd97efbbc1730ca72c5c0e8e2dd521c7fa3318cf88d613cce0ba3836fc5766deab762f19e5e6b60647a67139f4db5014617e7c54d7d570fcfe7dbc2afab7189ba65c198044659ee306074716f1caf651ac388d745b25c3b6074f10c2bdbf19df0dbf3786fd92563a663bbe3be28c96cefbd54bae5c978ae81be1d3c7b486981f7190fa6453fb73c19cf7dd0b783fb7e292d709cc1836981cf065d8c7b98081a3e873b180f3ebf94e58e04c62a478c03b260ac02c67fdd2b06c6818e18abb2601c088c623f1a181ddc7f4d310ecc8211ef53ca72c700e3458e182fcc82f1226094e58e054617f75213e0b7318c1703a32c771c305ee288f1e22c182f014659ee7860bcd411e32559305e0a8cb2dc3780f132478c9766c1781930ca722700e3e58e182fcb82f1726094e54e04c62b1c315e9e05e315c028cb9d048c573a62bc220bc62b8151963b1918af72c47865168c5701a32c770a305eed88f1aa2c18af064659ee54601ce488f1ea2c180701a32c57068cd738621c9405e335c028cb7504c66b1d315e9305e3b5c028cb9d068cd73962bc360bc6eb8051963b1d18af77c4785d168cd703a32c770630dee088f1fa2c186f004659ee4c60bcd111e30d5930de088cb2dc59c0789323c61bb360bc09186fb4300e76c47853168c838151963b0f186f8e9f31752d3d380bc69b81e796f879529add9c05cf2d6e7952dfd5bbd9e2ebd6f87da5b6c590a0f175bf157886c6cf93da16b766c1230ca5b01c6a765bfc8c29cd8666c1781bf00c8b9f27a5d96d59f00c03cd6eb368767bfc8c29cd8665c1783bf00c8f9f27a5d9ed59f00c07cd6eb7687647fc8c29cd8667c17807f08c889f27a5d91d59f08c08ea35bbc3a2d9c8f819539a8dc8827124f054c7cf93d26c64163cd5a0d9488b66a3e2674c69569d05e328e0a9899f27a5d9a82c786a40b35116cd46c7cf98d2ac260bc6d1c0531b3f4f4ab3d159f0d48266a32d9add193f634ab3da2c18ef049e31f1f3a434bb330b9e31a0d99d16cdc6c6cf98d26c4c168c6381e7aef879529a8dcd82e72ed06cac45b3bb1d31de9505e3dd169eb8bf937d97c5d77847751f1734beeec2500acb613f89098e18c767c13801186539ec2751e7887142168c75c028cb251c3366ea275107be27c6ef3bd52ed5058dd767a25b9e8cfd24d0f724475a4c0c1aafc524b73c19fb49a0efc98eb49814345e8bc9c033c5811609f0d1181e612885e5b09fc454478c53b2609c0a8cb21cf69398e688716a168cd3805196c37e12f738629c9605e33dc028cb613f89e98e18efc982713a30ca72d84fe25e478cd3b360bc17186539ec27719f23c67bb360bc0f186539ec2771bf23c6fbb260bc1f186539ec27f18023c6fbb3607c00186539ec27f1a023c607b2607c10186539ec27f19023c607b3607c08186539ec27f1b023c687b2607c18186539ec2731c311e3c35930ce0046590efb493ce2887146168c8f00a32c87fd241e75c4f848168c8f02a32c77b763c64cd72f8f3673df51d72acddd77d4754973f7ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe74cbe1f73e03b013e642a32e6ab202f0ca5b0dcdd9eb15933224f597c3ce55877f4f54d82ba7fd3c253e4a8eee8eb7182ba0b43be313e96078cb88f7b1d9bcee858c764531915cf138e781ecf82e709e079d211cf1359f03c093c4fc5cf938aa927b3e011865258eeee3c607c2c0f18bd8e5e472646af63e1e8e8193da367f48c8782311fda70cf9817f1986c2aa3e299193f4f4ab3a7b2e099099ac972b7b8654c369551f1cc8a9f27a5d9cc2c78668166332d9a39604c369551f1cc8e9f27a5d9ac2c78668366b32c9a39604c369551f1cc899f27a5d9ec2c78e68066b32d9a39604c369551f1cc8d9f27a5d99c2c78e68266732c9a39604c369551f1cc8b9f27a5d9dc2c78e68166732d9a39604c369551f1cc8f9f27a5d9bc2c78e68366f32c9a39604c369551f12c889f27a5d9fc2c78168066f32d9a39604c369551f12c8c9f27a5d9822c781682660b2c9ab132de9d078c8fe501a3631d934d65543c8b1cf12ccc826711f03ced886751163c4f03cf33f1f3a462eae92c7884a11496bb3b0f181fcb0346afa3d79189d1eb58383a7a46cfe819b363fc661e30fa6ded1959191d5c5f657c87e6e966ee3bea1d9ae6ee3bea1d9ae6eedbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece997c3f1bbfef64b6df987916785c7cf3c6513dcbd57a9fd3ebfa3246fd9456cf1b5a3d6d68550a659e03fd9e77a05f11f89575cbbcf8cb96b91301b323dfc9c3c3751c06f5171f8f197a28ff2f38aa7b545bff4233f71dd5d63777df516d7d73f7ede3dcc77921f8f671eee3bc107cfb38f771cee21bf3ad82faf376f9fea95ac78bf0ff22282fdf152e863253daa47fdb077e1f72e1dbef43fe585108be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671ce17e7180f9539e0090c9e2003cf42329e69643c73c878c690f10c23e3b9968ce722329e07c978ba93f14c24e31945c6733319cf95643c1790f1f427e3994ec6d3878c672e19cf5d643c4f92f10c27e3b99e8ce712329e87c97892643c93c9784693f1dc4ac67335194f1519cf7d643cbdc878ce21e3194fc6338f8ce76c329e11643c4f91f1dc48c67338194f7b329ecbc8781e27e3399f8ca7828ce711329e05643c53c978ee24e3b98d8ca79c8ce71a329e2e643c1792f13c40c6d3838c673e194f1d19cf4c329e6a329ec1643ce792f15c41c6d3928ca71f19cf22329e7bc878fa92f18c25e3e94cc6733b19cf75643c1793f13c44c6d38d8c671219cf2c329e1a329e21643c5791f10c20e3b9978ca73719cf38329e4e643c7790f1dc40c6938bef9966c35342c6534ac6732919cfa3643c33c878ba92f14c21e3994dc6534bc633948c671019cf40329efbc9787a92f14c20e31949c6731319cf13643c4790f17420e3b99c8ca7888027117c750c9304fcff59b0b53096559f7d9ddbb1feff2f697b0b58e6659d6f6959f74b60936fc9be6c5916757a09ea52a5f3e55f6f4ae984beaa605efc9500c7cb243c9793f17420e339828ce709329e9bc8784692f14c20e3e949c6733f19cf40329e41643c43c9786ac9786693f14c21e3e94ac633838ce751329e4bc9784ac9784ac8789e25e3b9818ce70e329e4e643ce3c8787a93f1dc4bc633808ce72a329e21643c35643cb3c8782691f17423e379888ce762329eebc8786e27e3e94cc633968ca72f19cf3d643c8bc878fa91f1b424e3b9828ce75c329ec1643cd5643c33c978eac878e693f1f420e379808ce742329e2e643cd790f19493f1dc46c6732719cf54329e05643c8f90f15490f19c4fc6f33819cf65643cedc9780e27e3b9918ce729329e11643c6793f1cc23e3194fc6730e194f2f329efbc878aac878ae26e3b9958c673419cf64329e2419cfc3643c9790f15c4fc6339c8ce749329ebbc878e692f1f421e3994ec6d39f8ce702329e2bc9786e26e31945c633918ca73b19cf83643c1791f15c4bc6338c8c670c19cf1c329e69643c0bc9782a2d3ccf3ae291f7dd65dd32ff2c896f07dba15cadf71547757a55afabb55eaff08bbf622833a35dfa573dffc06585cbfc3e01be9bf32a68f4aaa3bac8f62832b60ffa7ed1916f737c3e997fb199fb6e6ff86e5f20be3b18be3b14886f1fe73ece0bc1b78f731fe785e0dbc7b98f7326df0eae0d92f89d34998a8cf92ac8e3f5828befcb39aa6783ebc42f63d44f69f59aa195796d550a655e01fd5e73a09fedda53e6c55fb6cc9d0898312eca8278e36271fc754aaa7e878781ae8b0d7db15e4b1c691a750c59d2cc7d471d439abbefa8634873f7ede3dcc77921f8f671eee3bc107cfb38f771cee4fb759d8ff1bab11c7db40aeaaf075e07bfcb74be2846bf6a5d4bc16f117088bf6228f3bfe0b9a6dfe7fd3e1f976f7f6cf3715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e09b39cecdbcf4173f1bd85cf5e78f8ac55cbc4b70287d47c56273f71d158bcdddb78f731fe74cbe973bf09d001f3265eae3b71c78963ae07154cfd4b38d15469d9e35ea540a65f018bfc2413d8bc0afac5be657008f4c95c0e3220e1ab3cd91672119cf34329e39643c63c8788691f15c4bc6731119cf83643cddc9782692f18c22e3b9998ce74a329e0bc878fa93f14c27e3e943c633978ce72e329e27c9788693f15c4fc6730919cfc3643c49329ec9643ca3c9786e25e3b99a8ca78a8ce73e329e5e643ce790f18c27e39947c633828ce729329e1bc9780e27e3694fc6731919cfe3643ce793f15490f13c42c6b3808c672a19cf9d643cb791f19493f12c21e3b9868ca70b19cf85643c0f90f1f420e3994fc65347c633938ca79a8c673019cfb9643c5790f1b424e3e947c6b3888ce71e329ebe643c63c9783a93f1dc4ec6731d19cfc5643c0f91f17423e39944c6338b8ca7868c670819cf6b643c5791f10c20e3b9978ca73719cf38329e4e643c7790f1dc40c65342c6534ac6732919cfa3643c33c878ba92f14c21e3994dc6534bc633948c671019cf40329efbc9787a92f14c20e31949c6731319cf13643c4790f17420e3b99c8ca7888027117cf5ddff04fcff35b0c93beacf82ed0d9d5f0ab616161f2d757e05d88a755ed6d1264c2f74fceaba512757efe5a3af2a98177f25c0f10609cfe5643c1dc8788e20e379828ce726329e91643c13c8787a92f1dc4fc633908c671019cf50329e5a329ed9643c53c878ba92f1cc20e379948ce752329e52329e12329e1bc878ee20e3e944c6338e8ca73719cfbd643c03c878ae22e3798d8c6708194f0d19cf2c329e49643cddc8781e22e3b9988ce73a329edbc9783a93f18c25e3e94bc6730f19cf22329e7e643c2dc978ae20e339978c6730194f3519cf4c329e3a329ef9643c3dc8781e20e3b9908ca70b19cf35643c4bc878cac9786e23e3b9938c672a19cf02329e47c8782ac878ce27e3799c8ce732329ef6643c8793f1dc48c6f31419cf08329e79643ce3c978ce21e3e945c6731f194f1519cfd5643cb792f18c26e3994cc69324e379988ce712329eebc9788693f13c49c6731719cf5c329e3e643cd3c978fa93f15c40c6732519cfcd643ca3c8782692f17427e379908ce722329e6bc9788691f18c21e39943c6338d8c6721194f656e7892eadd76e96b1d00174e55905f013c4b1ce8e3a89ee5f85d832f635cafd2ea4d43abd70cad4aa1cc72d0ef4d07fa15815f59b7cc8bbf7c64563c8feabced3b108f92308a6d895b9ed47efb68d070cab4dfbe093c2eda3547f54ced5f2b8d3a3d6ad15dca60acae74504fdbbe23f32b613be41bb3e2795ce7853501e51e276114db0ab73ca9fdebf1a0e19469ff5a093c2eda1f47f54ced5fab8c3a3d6ed15dca60acae72504fdbbe23f3ab603be41bb3e27942e7853501e59e206114db9b6e79ba27a0ce3265dabf56018f8bf6c7513d53fbd76aa34e4f5874973218abab1dd4d3b6efc8fc6ad80e9ed933db98158f3cdb11d604947b9284516c2b9df2742f4f409d65cad48ead061e17edbc23dd53edd81aa34e4f5a74973218ab6b1cd4d3b6efc8fc1a8befb2205e2dd636428bb5169eb539d642fc65cbbc3c0f99bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da3981974563cf2ed4a614d40b9a74818c5b6ca2d4feabda0a782865391315f05f9b5c0b3da813e8eea99ea43becea8d35316dda50cee5feb1cd4d3b6efc8fc3ad80ed930afc94366af73d39815cf4c9d17d604949b49c228b6d56e7952edd8cca0e194a91d5b073c2eda7947f54cb563eb8d3acdb4e82e6570ff5aefa09eb67d47e6d7c376f0cc9ed9c6ac7866e9bcb026a0dc2c1246b1ad75ca934cbddf382b6838656ac7d6038f8b76de91eea9766c8351a75916dda50cc6ea0607f5b4ed3b32bf01b64336cc6bf290d9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a178ece8a67b6ce0b6b02cacd266114db3aa73cdd52cf1d66070da74ccf1d3600cffad879d2cf1d1ce89e7aeeb0d1a8d36c8bee5206f7af8d0eea69db77647e236c87e6cebc260f997d6ce486d9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a398196243f1ccd179614d40b939248c625bef9627f5dd833941c32953bf9d8dc0b3c1813e8eea99eab7b3c9a8d31c8bee5206f7af4d0eea69db77647e136c07cfec996dcc8a67aece0b6b02cacd256114db06b73ca9766c6ed070cad48e6d021e17edbca37aa6dab1cd469de65a74973218ab9b1dd4d3b6efc8fc66d80e9ed933db9815cf3c9d17d604949b47c228b68d6e7952edd8bca0e194a91ddb0c3c2eda7947f54cb5635b8c3acdb3e82e653056b738a8a76ddf91f92db01d3cb367b6312b9ef93a2fac0928379f84516c9bdcf2241350679932b5635b80c7453befa89ea9766cab51a7f916dda50cc6ea5607f5b4ed3b32bf15b643be312b9e053a2fac0928b78084516c9bddf2a4f6af0541c329d3feb515785cb43f8eea99dabfde32eab4c0a2bb94c1587dcb413d6dfb8eccbf05db21df9815cf429d17d604945b48c228b62d6e7952fbd7c2a0e19469ff7a0b785cb43f8eea99dabfb619755a68d15dca60ac6e73504fdbbe23f3db603be41bb3e259a4f3c29a80728b4818c586c78b458e784a0d9e528b1687cab79aafd0f912fd9b80ff5700a3abf67091c128f318e3c8eb5ab3f6064f7b43b343e95bd5bf52e70fd7bfb8bd2a8191617bb5cf81661d0c9e0e866687d2b7d2a29fce1fa17f717bf5034686edd501781cb4cfdd13068f9a329d6f6c73ac8fa37aa6ce37b60776ddf1382465f0d8bddd413d6de71232bf1db68367f6cc3666c53358e7853501e50693308a0daf5376c4cfd33d61f0a829533bb6c3b13e8eea996ac7de0eecbaef00dda50cc6eadb0eea59047e65dd32ff366c876c98d7e421b3d7b969cc8a6788ce0b6b02ca0d216114db76e079277e9eee0983474d99dab1771cebe3a89ea9766c6760d7fd1dd05dcae0feb5d3413d8bc0afac5be677c276c886794d1e327b9d9bc6ac7886eabcb026a0dc501246b1bd0d3cbb62e7498f07843c6acad48eed72ac8f9b7aa6dbb17703bbeebb40772983fbd7bb0eea59047e65dd32ff2e6c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a6798ce0b6b02ca0d236114db4ee0792f769ef47307e45153a6e70eef39d6c74d3dd3cf1d760776dddf03dda50cc6ea6e07f52c02bfb26e99df0ddbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219aef3c29a8072c34918c5f62ef0ec899fa77bc2e05153a6e70e7b1cebe3a89ea9e70e7b03bbee7b40772983b1bad7413d8bc0afac5be6f7c276d8eb993db38559f18cd079614d40b911248c62db0d3cfb62e7493f3f451e35656ac7f639d6c74d3dd3edd8fec0aefb3ed05dca60acee7750cf22f02beb96f9fdb01db2615e9387cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7b97074563cd53a2fac0928574dc228b6bdc0f37eec3cddca13068f9a8a8cf92ac8bfef581f37f54c3f773810d8757f1f749732b87f1d7050cf22f02beb96f903b01d9a3bf39a3c64f6b1911b661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e6266880dc553a3f3c29a807235248c62db0f3c1fc4cfd33d61f0a8a9c898af82fc078ef57154cf54bf9d0f03bbee1f80ee5206f7af0f1dd4b308fccaba65fe43d80e9ed933db98154fadce0b6b02cad592308aed00f07c143f4f3261f0a829533bf691637d1cd533d58e7d1cd875ff0874973218ab1f3ba86711f89575cbfcc7b01df28d59f18cd179614d40b931248c62fb10781cc45d8aa7d4e091f98f087cabf93a9d2fd1bfb8bdea8091617b95e640b3f6064f7b43b343e95bd57fa2ce1fae7f717b4d044686edd53e079a7530783a189a1d4adf4a8b493a7f84fec5ed35091819b657871c687628dbc343b96f1fca38f59a1f3acd8b0ea1e6458750f322af3995e60e8e2f493c9605c0805315e43f069e6fc7cf93ba2ff771163cdf069e6fc5cfd3d5513dcbd57abf03ec71ad5769f55d43ab8f0dad4aa10c327cd7817e45e057d62df3e2cf337be628663cb715d60494fb8884516cdf021e17ed86aafbf97a5db2fe5661fae4e87abf2e9e97e0bde2d67abdc221fe8aa1cca4b27ab6df69b612f8bf6c37559f0386cdd13bcc5d6dcfed645efc950439bb779bf15e326ae1e27953b6c7fd03169e2fe3e329c7fd1c7ded7754f76c9efdedb7f0c458f7ae51cf3df7c55ff754fbd145af4bd6aff6d1ff71b453cdbbe3be27ed4717a3cec5506650593ddb7f42fb616b2b5cef9b724e6eee9b2d82faf64cb8cab4dd7c26f4a5b64bb90fa03cb63915fa17f7cf0aa8abab7631ea1e13b68b66dbed527bf3b9a4e9bb1474f9805433db730ad4b1d2c25d49c08df198cbfd4cd66d7b465669e8c8a6196eeb0f2c3af6b370f723e066dcaffb193ab26976b0fd7ab0857b300137e37e3dd8d0914db383edd7432cdc4308b819f7eb21868e6c9a1d6cbf1e6ae11e4ac0cdb85f0f357464d3ec60fbf5300bf730026ec6fd7a98a1239b6607dbaf875bb887137033eed7c30d1dd9343bd87e3dc2c23d82809b71bf1e1134d4914db383edd7d516ee6a026ec6fdbadad0914db383edd73516ee1a026ec6fdbac6d0914db383edd7b516ee5a026ec6fdbad6d0914db383edd7632cdc6308b819f7ebc6f6db67ddafeb2cdc7504dc8cfb759da1239b6607dbaf275ab827127033eed7130d1dd9343bd87e3dc9c23d89809b71bf9e64e8c8a6996dbf76f42e61d6ef367ee8549ff418d31f66c1f33ef0b88829477150eea89f4baa6fea3e43ab0f0dad70ec8efda09f83be3019bf4920fe3cb367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed933f333e37719f1f98a94fb8084516cf84ccac57d7e55f70bf4ba64fdadc234e8d87abffb63f79b2c471d5aebf50a87f82b8632279c5acf76bd662b09bebadd702c6edc967b63af437a5b9af12ff3e2af04eab30f781cbc9f9fe2d96ff0ecb76881ef9dc6e33b39ca8dc6c972f57dbcc382faedbcd7a80f6aba2776ff0d352d3234dde3d8772268b83d8501a72ac8238f8b67c38eea996a0b761b7532352e85329da09ebb1dd4b308fccaba657e37f0c8d402785cc56060f004167d64aa24e39946c633868ce70c329e61643cc793f15c4bc6731819cf45643c0f92f17427e39948c6338a8ce754329e9bc9788e22e3b9928ce702329e62329efe643cd3c978fa90f1dc45c6731619cf70329ef3c8784e20e3b99e8c2741c6730919cfc3643c49329ec9643ca3c9783a92f1dc4ac6730c19cfd5643cadc978aac878ee23e3e945c6730e19cf78329eb3c9784690f19c44c6732319cfe1643cedc9782e23e379848ca7828ce77c329ea9643c7792f19c4ec6731b194f3919cf71643cd790f17421e3b9908ca72d19cf03643c3dc878eac878aac9784e21e3194cc6732e19cf91643c5790f1b424e3e947c6730f194f5f329eb1643c9dc978ce24e3b99d8ce71b643cd791f1b423e3b9988c671f19cf43643cddc8782691f1d490f11c20e32923e31942c6733419cf55643cadc8780690f1dc4bc6d39b8c671c194f27329e3bc8784e24e3b9818ca7848ca7948ce752329e19643c5dc978a690f1d492f19c46c633948ce758329e41643c6dc8780692f1dc4fc6d3938c670219cf48329e93c9786e22e339828ca70319cfe5643c45043c89e0abdf624ac0fff7834dbe19f43ed85a58d627cfa9a5bc3a2e2eedf8d575b7b0ac7b8f8501757a0fea52a5f3e55f6f4ae984beaa605efc9500c71e129ecbc9783a90f11c41c6731319cfc9643c23c9782690f1f424e3b99f8c6720194f1b329e41643cc792f10c25e3398d8ca7968c670a194f57329e19643c9792f19492f19490f1dc40c6732219cf1d643c9dc878c691f1f426e3b9978c6700194f2b329eabc8788e26e31942c65346c673808ca7868c6712194f37329e87c878f691f15c4cc6d38e8ce73a329e6f90f1dc4ec67326194f67329eb1643c7dc978ee21e3e947c6d3928ce70a329e23c978ce25e3194cc6730a194f35194f1d194f0f329e07c878da92f15c48c6d3858ce71a329ee3c878cac9786e23e3399d8ce74e329ea9643ce793f15490f13c42c67319194f7b329ec3c9786e24e339898c670419cfd9643ce3c978ce21e3e945c6731f194f15194f6b329eabc9788e21e3b9958ca72319cf68329ec9643c49329e87c9782e21e34990f15c4fc6730219cf79643cc3c978ce22e3b98b8ca70f19cf74329efe643cc5643c1790f15c49c6731419cfcd643ca792f18c22e39948c6d39d8ce741329e8bc8780e23e3b9968ce778329e61643c6790f18c21e39946c65349c6d3c2e0c1ffab77c3f6e9bc7c3ba818fe3f59772e6fafd72565e419b1ba57f1ae6153f5dde5a8beef06f55315ccef82fa0afbbbc0f3ae239ef70c1ed37709e42b41b39d864d31bee38871a7c128f3ef00a3e8b71378763ae2d965f098be4b20df0f347bdbb029c61d8e18df3618657e07308a7e6f03cfdb8e78de31784cdf25901f0c9a6d376c8a719b23c6ed06a3cc6f0346d16f3bf06c77c4b3c3e0317d97407e0868f69661538c5b1d31be6530cafc566014fdde029eb71cf16c33784cdf25901f0a9a6d316c8a71b323c62d06a3cc6f0646d16f0bf06c71c4b3d5e0317d97407e1868b6c9b029c68d8e1837198c32bf111845bf4dc0b3c911cf6683c7f45d02f9e1a0d906c3a618d73b62dc6030cafc7a6014fd3600cf06473c1b0d1ed37709e4478066eb0c9b625ceb88719dc128f36b8151f45b073ceb1cf1ac37784cdf2590af06cdd61836c5b8da11e31a8351e65703a3e8b70678d638e2596bf098be4b205f039aad326c8a71a523c65506a3ccaf0446d16f15f0ac72c4b3dae0317d9740be16347bd3b029c6371c31be6930cafc1bc028fabd093c6f3ae25969f098be4b203f06345b61d814e372478c2b0c46995f0e8ca2df0ae059e188e70d83c7f45d02f93ad06c9961538c4b1d312e3318657e29308a7ecb806799239ee5068fe9bb04f21341b3d70d9b625ce288f1758351e69700a3e8f73af0bcee8867a9c163fa2e81fc24d06cb161538caf39625c6c30cafc6bc028fa2d069ec58e7896183ca6ef12c8df0836e1ed0bb65775be0fd85ed1f9de607b59e77b81ed259def09b61775be07d85ed0f9ee607b5ee7bb81ed399d4f82ed599def0ab66774be3fd89ed6f901605ba4f355605ba8f303c1b640e72f04db7c9dbf086cf374fe62b0cdd5f94bc03647e72f05db6c9dbf0c6cb374fe72b0cdd4f92bc0f694ce5f09b62775fe2ab03da1f35783ed719d1f04b66feafc35607b4ce7af05dba33a7f1dd8eed6f9ebc1768bcedf00b60f75fe26b07da4f33783ed639dbf156cdfd2f9dbc0f66d9dbf1d6cdfd1f93bc0f65d9d1f09b6efe9fc28b07d5fe74783ed073a7f27d87ea8f363c1f6239dbf0b6c3fd6f97160fb89ce8f07db4f757e02d87ea6f393c1f6739d9f02b65fe8fc54b0fd52e7a781ed573a7f0fd83ed1f9e960fbb5cedf0bb6dfe8fc7d60fbadcedf0fb6dfe9fc0360fbbdce3f08b64f75fe21b07da6f30f83ed0f3a3f036c9febfc2360fba3ce4bbba6dad93fe97c59106f3bfb45503f95816ff1a7cafc59e7db186564d962287396ee50a89e71a86f994a3b2cedb2b2493bfc2ad8a41d7e056cd20ebf0c3669875f029bb4c32f824ddae117c026edf0f3609376f839b0493bfc2cd8a41d7e066cd20e3f0db62a9d5f0436698717824ddae105609376783ed8a41d9e07366987e7824ddae1396093767836d8a41d9e0536698767824ddae1a7c026edf093609376f809b0493bfc38d8a41dfe26d8a41d7e0c6cd20e3f0a366987ef069bb4c3b7804df6972fc0266df3876093b6f923b049dbfc31d8a46dfe16d8a46dfe36d8a46dfe0ed8a46dfe2ed8a46dfe1ed8a46dfe3ed8a46dfe01d8a46dfe21d8a46dfe11d8a46dfe31d8c6ebfc4fc0266df34fc1266df3cfc0266df3cfc1266df32fc0266df32fc1266df3afc0266df3276093b6f9d76093b6f9376093b6f9b76093b6f9776093b6f9f76093b6f953b049dbfc19d8a46dfe03d81ed17969abdb824d9e15aba9fc6b4e380e4f0bf0252c5541bc6d3f4e5590c7bacb5449c633978c670c19cf8b643c6790f10c23e3399e8ce730329ec5643c13c9781691f1ac20e3594ec6f31a19cfa9643c9bc8783692f11c45c6f32e19cf2e329e0bc8788ac9786693f13c4fc6731619cf70329ef3c8784e20e34990f12c20e35946c6b3948ce715329e8e643c1bc878d693f11c43c6b3938ce71d329ed6643c5f90f1cc24e339878ce759329eb3c9784690f19c44c67338194f7b329e0a329ef3c978e691f1bc4ec6b3848ce725329ed3c978d691f1ac25e32927e3398e8ce76d329e1d643c5dc878da92f13c49c65347c6f334194f3519cf29643c83c978ce25e339928ca725194f3f329e5bc878e690f1bc40c6d3998ce74c329e35643cabc9783e27e3f90619cf76329e6d643cedc878f691f14c22e35948c65343c6f32a19cf01329e32329e21643c4793f1b422e3f9908c671619cf73643cabc8785692f19c48c6f31619cf56329e12329e52329ef9643cb5643c2f93f19c46c633948ce758329e36643c4f91f13c43c6f32619cf1b643c2793f16c21e3d94cc67304194f07329edd643cef91f11411f0248023009bfcbf25d8e43b3c07c0f699ceef039b7cc36731d83ed5f947c0f690c5d6c2c2270c33c026efca7e0636b93ff330d8e49d894fc126e70de25fcdafeef855fe16b08cf86969e1477f9f5ab8248fdb5b96a90ae2dddee8ab2ab07ff3aec8603cd43cef91f1ec26e3e940c6730419cf66329e2d643c2793f1bc41c6f32619cf33643c4f91f1b421e339968c672819cf69643c2f93f1d492f1cc27e32925e32921e3d94ac6f31619cf89643c2bc9785691f13c47c6338b8ce743329e56643c4793f10c21e32923e33940c6f32a194f0d19cf42329e49643cfbc878da91f16c23e3d94ec6f30d329ecfc9785693f1ac21e339938ca73319cf0b643c73c8786e21e3e947c6d3928ce748329e73c9780693f19c42c6534dc6f334194f1d19cf93643c6dc978ba90f1ec20e3799b8ce738329e72329eb5643cebc8784e27e379898c670919cfeb643cf3c878ce27e3a920e3694fc6733819cf49643c23c878ce26e379968ce71c329e99643c5f90f1b426e379878c672719cf31643cebc9783690f17424e379858c672919cf32329e05643c09329e13c878ce23e3194ec6731619cff3643cb3c9788ac9782e20e3d945c6f32e19cf51643c1bc9783691f19c4ac6f31a19cf72329e15643c8bc8782692f12c26e3398c8ce778329e61643c6790f1bc48c633868c672e194f25194f0b0bcf01473cf2ad1859b7cc1f68e6be7719be771588ef770cdfef1488ef1d86ef1d05e27b9be17b5b81f8de6af8de5a20be371bbe371788ef8d86ef8d05e27bbde17b7d81f85e6bf85e5b20be571bbe571788ef9586ef9505e2fb0dc3f71b05e27bb9e17b7981f85e6af85e5a20be9718be9714886fe6eb6ff59d30e9abbc5bff26e0ff15c0b8d811e3018351e61703a3d8f07bd4158e78a2aedd2b087c2b2de45e963cf34cc0ff2b81d1554c55188c326f8ba95dc053e98827ea9e4325816fa585bc8b2d7d2a13f07f1c7fd9554c551a8c326f8ba97780a79f239ea87b25fd087c2b2de4dd6779e72f01ffc7f1d65dc5543f8351e66d31b50378063be289bac73398c0b7d242be1526dfa449c0ff717c46573135d86094795b4ce1f8b9431cf144dd9b1a42e05b6921dfda956f5e26e0ff387e93ab981a6230cabc2da670fcb8a18e78a2eea90d25f0adb49067c1f28df604fc7f1830ba8aa9a106a3ccdb620ac7bb19e68827ea5ee03002df4a8be13a2f7dac12f0ffe1c0e82aa686198c326f8ba98dc033dc114fd43dcce104be951623745edee148c0ff4700a3ab981a6e30cabc2da6d603cf08473c51f75e4710f8565a54ebfc3afd9b80ff5703a3ab981a6130cabc2da6d6024fb5239ea87bc6d504be9516353a2fdf9c4bc0ff71fcf7118e18ab0d46991f018c625b0d3c358e78a2ee75d710f8565ac8b7fd57e9df04fc1fc7637515533506a3ccdb620ac783ae75c413758fbe96c0b7d2628ccecb983009f8ff1860741553b506a3ccdb620ac7af1ce38827ead9c21802df4a0bf936d70afd9b80ffd701a3ab981a6330cabc2da696034f9d239ea506cf528b1687cab7d242fa722fd3bf09f8ff44607415537506a3ccdb626a29f04c74c413f52c6722816fa5857c5bfb75fd9b80ff4f0246573135d16094795b4c2d019e498e78a29e414dca81efa8e729b9f01df56c2017bea3ee73e7c277d43ddb5cf88ebaff980bdf51f7d272e13beabe502e7c47dde3c885efa8ebf55cf88ebaf6cc85efa8eba85cf88eba26c885efa8f3db5cf88e3a57cb85efa8f30edf9efbf63c6edf87f2dca150dbf343790c3d94c7127f6de0af0d72e5db1f4bfcb541ae7c17eab5816fcf73df9ecbf55751107d3df68623dfcb0ddf328fcf59963bf2bdd4f02df3f8cc60a923df4b0cdf328ff7bf9738f25d6af896f92539f0dddef0dd3e87be3b18be3b587c3bd8dec944d0f0fa5b1870aa823cc6c0eb0eb47054cf72b5de657a5d5fc6b85edb7d1b737f298532cb403fd76d87acdb6c3bf29119e3a2283edfe509f021df255336797efc2ad8a4dd7f056cd22fe065b0c9b1e925b0c933a917c126cfac5e00db189dff106cf2ec18fbeccbf3ff1d60abd679ec2b3e42e7b7814dfa52611f65e90fb7156cd2a711fbc64abfd4cd6093bec5d82753fa876f049bf4f1c7be80f29ec67ab0c9bb36d8074dde975a0bb67d3a8f7d9fe43b34abc13643e75781ed0f3abf126c0feafc2d60fbbdce7f01b6dfe9fc12b03da0f3af83edb73abf0c6cf7ebfcf360fb8dce3f07b6fb74fe59b0ddabf3f82edbaf75fe3db07da2f3f80ed5749ddf05b65fe93cbebb738fcebf03b65feafc33609ba6f34f836daace2f02db2f747e21d87eaef30bc03645e7e783ed673a3f0f6c93757e2ed87eaaf373c03641e76783ed273a3f0b6ce3757e26d8c6e9fc5360fbb1ce3f09b61fe9fce760bb4be79782ad85ce2f079b8c1989fd548a75fe0db0b5d279ec7f24dff79f04b6363a3f116c6d75be0e6cf26db8316093f1a06bc196d0f91ab095e87c35d8e4fc6c04d864fc93e1609373a961603b42e787824dce7b86804dc6b31c0c36f906693fb01dadf39560936feb5780ed589d3f003619736c31d8e4bb75fbc02663313f0c36f95ef50cb09da8f37f009b8cc3f220d84ed6f9df83ed149dff1dd8e41b9e0f80ad4ce77f0bb68e3a7f3fd84ed3f9df804dc6c8ba0f6c67e8fcbd6093b1837f0d36f9def32760eba4f3d3c176b6ceff0a6c3296c83d6093f1417f09b6ce3a3f0d6cf21deea9603b5fe77f013619efefe760936f0c4f019b8cebf633b075d5f9c9604beafc4fc1d64de72780adbbceff046c3d747e3cd87aeafc38b0f5d2f91f83adb7ceff086c7d745eda19b53fabfd7cbf9eaf0ae23b2f53fede0f1a4e99ae0d840179e23cd72e051ef4b537f6ba2753e7f5b2dfb7d0eb9518da0bbe77c7ee3b7d4db147afab955eef6ec3773194395b370e6ab977e1ff555007590eef63c9ba65990b60d9f78c75b7d7f5dde3a8bebb0d26e1de034c52e6bc53ebcbfe40e7dbc23231b2a5ae8f25d602d010a72ac80b831bad92e578dedb189e3dc0b337769ef4f5ba8b98c07d2beeeb75f33eae196ba5506637e8f79e03fd705f9775cbbcf8f3cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccfac78f6eb3c3e579672fb4918c5b617785cdce7c7e7b0f8ccebbd53ebfdee8ddd6fc3e77badf57acb8d3a1743992fe199d33e9d2f81ffcb768bda960e9e1366dc96e2af04ea83cf82f63be2d96bf0ecb56821f9b2d87c2747b9d13859aefab2a867ecfb0c5df75b3475b5bfeed5eb2a3234c5fdf57d83079f8d9600ef07fa3701ebf900eae0601fcf1817e20ff7a5bd6093fcfbc0e8623be3b144da03791e2efef0b9f8af8ce7e2f16ffb64b9cb76439ef99bcfdbb1ae52e677d0f67daaf3d837643faceb1f96ffcb94e939b5e8a7eabc33fe3aa7b6aff46994edbbd3e2fb6d608dc9778377688a74123f622f86fcdfa13f8794133d446b61c7f1ca91dd5cee7d63b95228b3cb52ffaa20defaef3478761acc2a763e8738fb071cff5db549bb2234ba003492327b41a37d8e78f61a3cc221fe5419d9fe6d8c32b26c3194f99fd046a9ba483b2ff5c4be2d780c78d751fdc497ac5be6c51f9e1bef0146b38e2a3e061d5bcfbb3776defceaffd5a62cfd8bed7a5cfdbf64ddedf5b2c21118eb2f87f5ff8b2b883eb6fc6bfb96d5afdf65ffb27d469d85650f304999f665f5652fd5f96ccef50fd5755bd4b9fe2e073c89a0e1b5b79a321ddff118e3a27d7154cf72dbb1eb3da34ea550a613d4d3c1794cc6778177826f17db1cb59073a8dd8616c550a66359fa57da8e281df15a754f4eea92b49e0f965bea22653a95d5d7a52dd8e36472b9ddf03c4bad77afa5ae52e6bcb2fab25d743e01db09dbd27e96ffcb94a93dc0b178b6c75fe7d4f69577de64fb6eb7f87e0b5863f2dde05b2072be2f7ec45e0cf9cab2fab2524ef410ad855ded23f2ce1fb29bcbed36962b85323b2cf5af0ae2adff768367bbc1ac62a76b597d5ee2c865bbb92342a372d048cae0fd6339b6e37b77b6e3fe5e47dc51c7fdbdc068b69b78eee2926d9fc166de43b59d0f4a195916cf07af2a4bffaa763661296bde1b76711f13df410da01e8151579930061c5c1b76c76b2769a7c44f17b0efd579d1b98ba15d3194195c96fe7578de6dbd77695edfe13585709bfb16befb31b4ac9e1bc74edcab7f4bc0f691fe75749dd6dd76cf50386cf70c4794d5b3e3b2c2f5a1a52ea281946d117cf59efa974659bcef966939336f8e43a9f4fdc82867f383d73cb1bdabd1b5bc1c995a58b4c0fbde52ae28f8ea989bb21f60cc99f751ba18ebc1fb287565e95f6993ccb2aa4dfa1f47d7eb23db51b4c3f60463f27d60acd2f9f2af3775b5d55fe6c59f62fcc0a8839bb62bfdbe5236f781f7018f8bb6dd511b5d8ec7d8b6b1adb74fb5edf8ffbea1550e9fd75a8ff9e633f7b6463e1edfc91adbfd279b16bb2d3cae9ea34469b1dbe23b3e2d7a8eb21d3f6c5ae4b2ef439416ef597cc7a8452ddef7cca4c5bb161e57f7baa3b478d7e23b3e2d7a95677aae815aecb2f0b8baf710a585f8cb96f93d02e6b6463e1edfddab6df7c96c5aecb4f0b8ba6e8ed262a7c5777c5a74ed89f7e83269f18e8527fefb7399b578c7e23b3e2d7af7c17b7899b478dbc2e3ea996e94166f5b7cc71817a36df7726c5aecb0f0ecc8b1163b2cbe633c3fec69bbd766d362bb85c7c17dd78c5a6cb7f88e518b9178df359316db2c3cdb72acc5368beff8b4a8ee61bb276cd3e22d0b8fab7bc2515abc65f11d9f16237b2bdf5b1ba1c5560bcfd61c6bb1d5e23bc66ba8545c6c6984165b2c3c5b72acc5168beff8b4a8499d6b6d6e84169b2d3c9b73acc5668beff8b4284f1d533735428b4d169e4d39d66293c5778c7191ba9edcd8082d365a7836e6588b8d16df311e475271b1a1115a6cb0f06cc8b1161b2cbee3d3a23675ff697d23b4586fe1599f632dd65b7cc778cf251517eb1aa1c53a0bcfba1c6bb1cee23b3e2dbaa58ea96b1ba1c55a0bcfda1c6bb1d6e23b3e2d46a79e89ad6984166b2c3c6b72acc51a8bef18cf3b53edc5ea4668b1dac2b33ac75aacb6f88ef1bc3375ff625523b45865e15995632d56597cc7d876a6ce3b5736428b95169e9539d662a5c5778ce79d292dde6c84166f5a78deccb1166f5a7cc778de993a8ebcd1082ddeb0f0b81a03254a8b372cbe638c8b54dbb9a2115aacb0f0acc8b1162b2cbe63bcaf956a3b9737428be5161e57e3354469b1dce23bc6eb91d43dbe658dd062998567598eb55866f11de3b3a2d439f8d24668b1d4c2b334c75a2c05dffb62f79deecf2d3ea42fd6f98616c550e6948ee95fe98b15a5a3ac03fb95615d5e8fbd2ee97e654b22eaf23ad445ca9c0175691b3819a3a8bba3baa66266b15e97f44dffc0525729734ec7fab29d753e01dbe44358575fcbff652a32e6ab202ffaa93abf1a7f9d53b12a63c8c8f67dd5e2fb65608dc97757f45da493f8117b31e4fb74ac2f2be5440fd15ad8d53ef29ace23bbb9dc5263b95228f39aa5fe5541bcf57fd5e079d5604ebdf700712671e4a6ed4a33bd16a1d1f9a09194c13e7b1f38e231fb100a87f8536564fbb731ca601f4a297321b451d8af54ea9908beda6f52d56fb1a3fa892f59b7cc8bbf52b0ed0346b38e2a3e3e81be9f3256848c23a16c322e4437584f2fc3a6eadadb515dc597ac5be67b03a38c53d12bf78cc9c632f63418154f5f079ae1d81b32653a5ef4059e3e0e781cd533751caa30ead4dba8532994c1771b2b1cd4b308fccaba65be027cbbd8e6a8851c93cf31b4288632238cf3c7281d651d2a7e7b59ead2df715d64ddd22ef5cf81ef4ac3770fc3772268b89d8320f3fe5509ccfd1c30abf50e887fbde578de2631257e7a409d06820671d509d725e779030d6d8b213f0dcef3a49c9495e397b0ab58966d89ece6727d8de54aa14c7f4bfdab8278eb3fc0e0196030ab63f75d706ee7607f48c5407f8343e67b80760322b4eb0fda49193cfef574a45d3f8347e67b028f9ce354804dce15843f01ffef96036eb3ddabb0708b0dc789eb6961ec113f63ea5ca7a7c128f33d80516cfd80a7d29166e6b63ec7d0078fcb6d8c32b26c3194990dc7c684a5acdaef3a15d5d7aba5b6c7f6ee986ed35b3bd00bc7690c409fc0d0502661681bd48fe518274fbba07eacc62953eb268fbc73f40da3d38f1e05add8c0c4df224b355a800df32d2db6206838246531d86448ca56606b61c88243614a7919d2ce855ca887acbbd8e06c0b2c71fac6e13c65ca143a6d80c74528abd091213d75e8dc3279ecd4d1181fad0ccea6c48efa5fcb0ce5a2d6e56a3b98fb4415cc9b3158ecc87f4ba86f15cc8b3fb56d4a757ee2c851770f9c7ce7b4f1a3274c9d8242993b36e68b82861bc0fc8d12dcd54e87018015c6c6a195512f6c30e47fb261dac5cfd91dc7cc35b509c09f4ced40b7c31ce8a6d62f63df8e1a396edc75d3aac78d1d75e9b409a3a68ead9b805bb3ada15cd49696ffb7069bad89c7b26ac2660b976d63b1d9261c65b82dd8e4c87518d884a71dd85a425eca9b5bc649b87682f5cb2ea5fea7c469a52bde26a80f01391cab7655edbfeaf3b1ea34480d75ac8636569b530d5dacee18aaa189d557ecd4d0c36aa86135b4f009417ae8603554f0c9417a2860f5b58bb2203db4ef69417ae8de3382f4d0bc6701dfb781f9ec207ddaa586d6ed1ca487ce55b72ed5abebea336feadd7a75faae6e0ba8535e7589a74e3fd569a7babc50b72fd4ad2c754aa74e97d5a9a03a7d53972303b4d603c37461982e0ad3c561ba244c9786e9b2305d1ea62bc2746598ae0ad3d5611a14a66bc2746d98ae0bd3f561ba214c3786e9a6203dbcf3cd417af87535fcf3ad417a68e8db82f4b0d1b707e921a5ef08d2c34d8f0cd243518f0ad2c3548f0ed24358df19a487b71e1ba487c9bd3b480fb53b3e480fd7ab86c356c364abe1b3d530bf6a486035a4b01a6a580d4bac8630564320aba191ef0fd2432eab219b1f0ad2c33ecf08d323617a344c8f85e99b617a3c4c4f04e9e1c1d5b0e13383f430e36af8f139417ab8f279417a787335ecb91a0e5d0d93ae864f57c3aaab61ded5f0ef6a58f817c2f462985e0ad28f24d4a318f58842ddfe57b7a7d523a2d783f4adf36541fa11b77ae4afba40a82e21aa8bccaa20dd854a7529535dec549743d505537549555d74559765d5855b7569575dfcd52b0fea1510f54a8c7a4548bd32a55e2153afd4a9570cd56ba2eab54bf51ab17aad7a6f90be2dbe3f483f2a55b7c3d5a30175cb5cddbeff384cdf0ad231f99d307d374cdf0bd3f7c3f48330fd30480f6bac863b56c325aba195d530cc6ac8663594b31a0a5a0d1bfd49901e7a5a0d5dfddb203d24f6efc3f469983e0bd2c36b7f1ea63f86e98b30fd294c7f0ed35fc2f4d730fd2d4cff16a67f0fd37f84e9ef61fa4798fe19d40fb38d0dc909baf5d15730c1c8a953478f9f38b56c6a5dd9f869e3a68e9d38eebeb2e963a78e29abbb67f4e4da7175d371e16feb85658cf08193278fbcaf6cec849ad1f796d54d9b5a56575b565d376d424d8383f85ff442277dd5e3c89a9a6867fff57548ff4f139d1ea6db45197dfd8acc752b69d904418e6cca423d5b36ad4293f5114c2e756f4c9f07974d195737b5acbc6c42f8373cf0d64d1f5dd3a50cff37251479cad4b22953474e9e5a563bb96e7c59d72eb8de87db35a112ffddce0dcc9927344d9c4efa3b4b4d0ab15f9eda0405fef3d4a691b62efb1aa4edca9ae6b4acac09353cab290b5dd944c29bca22659932ad7aeae491a3a6462f7cebd759f88ea654734213ab7972c726383bbd290b0decd834c23b9ae26c5616ce82ff0f9c57cf6b84550600", + "bytecode": "0x1f8b08000000000000ffed9d779815c5baee7b6008b26644ccd9c1848ae2b0c8cc008339614611116118465060886246dd067230672428390b2828490c3be7e40eea76bbd33967effddc3fce3de706efed5aabbe3def94d58b5963d7e25db3aa9fa766557f53dddfafdefeba3a5577fd330882a2203db50cd3e9c1d727f97f95fe2dff6653d718d755ee92b3284f385be40967cb3ce12cce13ce5679c2d93a4f38dbe40967db3ce13c24464ec5d6226838c5cddbce81ae713326f24cd3923cd0b434cf343d340f346d1fe4471b75589e7076c813cec3f384f3883ce13c324f388fca13cea3f384f3983ce13c364f388fcb13cee3f384f3843ce13c314f384fca13ce93f384f3943ce12ccb13ce8e79c2796a9e709e96279ca7e709e71979c279668c9c9d81b393fe3d4bff9ead7fcfd1bf52f65cfd7b9efeeda2eb58ace7cf575c61520f6992c6ffba85a97b987a84a9a7f1bf5e61ea1da63e61eaabff57a6ff5711a6ca30f50b53ff300dd01a0c0cd30561ba304c1785e9e2305d12a64bc37459982e0fd31561ba324c5785695098ae0ed33561ba364cd785e9fa30dd10a61bc334384c3785e9e6300d09d32d611a6ab0dc1aa66161ba2d4cc3c3747b984684696498aac3342a4c35611a1da6da30dd11a631611a1ba63bc3745798c685697c982684a92e4c13c334294c93c334254c53c3342d4c7787697a98ee09d3bd61bacfd0ecfe303d10a607c3f490c139234c0f87e991303d1aa66f85e9b1303d1ea627c2f4649866866956986687694e98e686695e98e68769419816866951989e0ad3d3617a264ccf86e9b9303d1fa617c2f462985e0ad3cb617a254caf86e935cd223bc2e230bd1ea625615a1aa665615a1ea637c2f4669856846965985685697598d684696d98d685697d9836846963983685697398b684e9ad306d0dd3b6306d0fd3db617a274c3bc2b4334cef86e9bd30ed0ad3ee30ed09d3de30ed0bd3fb61da1fa60fc2f461983e0ad3c761fa7698be13a6ef86e97b61fa7e987e6068fec330fd284c3f0ed34fb4eda7faf767baacdcbffb79987ea1f3bfd4bfbfd2bfbfd6bf9f18cbfc264cbf356cbf0bd3ef0ddba761fa4ce73fd7bf7fd0bf5fe8df3feadf2ff5ef9ff4ef9ff5ef5ff4ef5ff5efdff4efbfe9df7fd7bfffa17fffae7fffa17fff19a62d1dd3f9b641fd5415c4d44675af4d3dfb11f13b050d27a5454bfd3ff92dd3f6623d2fbfa25d2b3ddfcab0b7d6f3ad8df5b4d5f36d0d7b073ddfc1b01fa1e78f30ec47e9f9a30cfb317afe18c37eba9e3f1dec8900ee0d6bbbb2b5d4a622b049bcb6005b2b6d6b09b6d6b23ab0b5d1b6566093eddb1a6c87685b1bb0b5d3b6b6604b68db21a265984ab4ad2a882b56ca47aaf596c6bd5efdbcecd0f87947a9f5b677c47b58fcbca3d57a3b38e055f171b85ed761103747685b07b01da96d8783ed286d3b026c476bdb91603b46db8e02dbb1da7634d88ed3b663c076bcb61d0bb613b4ed38b09da86dc783ed246d3b016c276bdb89603b45db4e025b99b69d0c36dde406a780ed546d2b03db69dad6116ca76bdba9603b43db4e03db99da763ad8a4fd3d036c72be78a6b6a9b6e390225846dba5dd4a2d236d36d8ce96f61a6ce7485b0db6ced24e83ed5cf02db6f3a0ad115b176d93764bfdafafce570571ed27c95ab5de8ab8d71bae59adb75ffceb4d3d73ec1fd4eb5a057e2a40ab013a1f63bfa6aee8bb4827f123f662c85f0165a59ce821c71e6157c7984a9d1f9061b9bec672a550a6d252ffaa20defaf73378fa19ccad20ef2666bb75f331dbe829eb981d0265cdd893f3a0e618b38380c341ccf6f231dbe829eb98ad85b266ecc9b970738cd95b81c341cc56bb89d964b98fd9f47db320b0c79e5c0f35c7981d0b1cf1c76c0f1fb38d9fb28ed947a1ac197b724ddc1c63763a70c41fb3bdaafdb941a3a7ac6376219435634feecf34c7987d1c381cc46cad6f671b3d651db3af415933f6e45e61738cd9a78123fe98ede32866bbf9980dd2cf4083c01e7b72dfba39c6ec12e0883f6647f9fbb38d9fb28ed91d50d68c3d7986d21c637683ceabe70c3fd5cf194e04dbcfb4ed24e08d3fb66b7a388aeda48fed74df9020b0c7a83ccf6b8eb1bd5be7551cff12fa2388ed57dad6116cbfd6b653c1f689b69d06f572b00f54fb7da0d153d6fbc06fa1ac19cbf26cb939ee033f060e07315be363b6d153d631fb37286bc69ef473688e31fb29703888d95a1fb38d9eb28ed9ff82b266ec9da5f3cd3166a5afa93a5ff85c9f2f9c03b63f685b67b07da16de782ed8fda761ed8bed4b62e60fb93b69d0fb63f6b5b39d8fea26d5dc1f6576d4b82ed6fdad60d6cffa66dddc1f6efdad6036cffa16d3dc1f6776deb05b67f685b6fb0fd53dbfa689b7ade257dafe4bcb52df05705f16e5be97729eb96f9ae39f0dddef0dd3e87be3b18be3b587c271df84e800f998a8cf92ac827ddf29497020ffaea1ebfaf6eaaeedd82c6d7bd3bf0f47050f704f8680c4f0fe0e9193f4faaff6faff8d79bdac6dd0c4d13e0ab1bd4abb7837a15812f59b7cc8bbf52b061dbdadbc2d8277ec66411f89275cb7c1f60141bb6f5f2ce95ec3fea78d8a9a89ed7c1be943a27427f55c021fe8aa1cce51debcb76d66c25f07f3ceef5346c8ee2321517e24bd62df3e2af04ead333f78cc9c632f630185db51145e04bd6ed7dd76f07c9e371dcc1b58eb54d13df1539f0ddc7f0ddddf08d6da74c998e6d7d8039f66b4e7d6cab8c7fbde5787d22d786e207cf1ff01a2eae3aa16fb936143f622f86fcd545f565a59ce821edb0b0ab58966d89ece672bd8de54aa14c85a5fe5541bcf5af34782a0d6675bcb9108e850ef687540c54181c32df1db4ab8cd0ae02b49332678176aedab3be068fccf7041e69c77a018fab6ba2289e5c5c8f1dc8379ec3e2f5b3fc1fcf035c6dafae06a3ccdbb6571f60b49dab38b89ec978aed20318c5d61778ba39d22c6abb7623f1ed205652ed91f8907373d97fc55f3194e9d3b2beec9dd056ba88118c47991a7bcd1bff764aa6aec17b64c183dbcec175555747f1588ef76fbe0ae28d35b35dea616815758fc7555bdecde09179f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f199f2761bf2d29d79384d1ecffe6ea3e7feafb877a5df80ce87f3bed0f962cc7fe31d20fe21ca3cec550a6b4453ddbff83fe60e6732aec23d9d3ad76a96d89fd31ab605efc615f2bdc960cfd9dca62f39d1ce5ea799bfa0698fa8ea6d9f7b3a7455317fd9f51d3224353ec8f7faec1a3e2b4b2653d9b8b677fd93e8b44ad241fe7b3bdd2c01eebf16f97648367d62d8286ed071e675cf5df91b65a9e975718be8ba1cc092deab70df6b3aa823ac872d8ef47d62dcb9c03cb561aeb6eaf97158ed6c6fa7bc1b252e6646853f7b6a8d7cc415b99ccb6ef3a3e378fff389c7e8edf2d0b9eaec0e3a29d7174be518efb40dccff1cdfe69b6f31829837dfb1cf4abccd8df49fc7966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563ce6b3567cbfb63b09638efa3ea49e67c8b7caf0d9d48616f57e5d3f8793674e9d8d3ae3bba3ff6c51cfb645e74b82aff77788da96aebe4f11b52dc51f7e7b069f05b978ae5b04be64dd498b16922f8bcd77fa39be8bb121e4397e3743d7ee164d5dedaff88c1535c5fdb587c183cf46a3beed93346c2efb0e45c585f8c37d290936c9e3fbd12eb6331e4bcc7e3de20f9f5f7f576bdb3e70b5ed93e52edb0d79362fcfeabb59ea2a657e046ddf4f741efb7060df91cf2dff9729d3736ad14fd5d9c1f735cb8b605db27d6ddff61c08ac31f9ee8aeb2ad269a0a14131e43f6b515f56ca4959d15ad8d53e22df80417673b91ec672a550a6bfa5fe5541bcf537bfb53ac06056b1f37388b3cfe1f8efaa4dea1fa1d139a0919471fccd466bff4ab35f21b6a36d8c32b22c7e8beeafd04645f51fb51d035c1fc764ddb6e398795c684c3fcf42efa7f5dfd05ec4dd4febbf2186b09f5660acbf33ac5fb8da04d1c71629f37f8df59be7e4b20cf603fbd77e02df7349ea7c36e7e407ebfaca764e8ecb45d55d31e377d0aa6264c69840168c2729d34e6b2ddbac3282bb8f65d9d28865452bf35b6125c1d7f573f39db5f43e3fc0a88bc4357e835cca1c01757173de923e0774f54d395997b403494b5da5ccb1b0af1daff309d84ed8369f6df9bf4c99ce01710cf70be2af736afb5ea8d725dbf7028bef8b803526df5dd1b79c038a1fb11743feac96f565a59ce8215a0bbbda47e43c0ad9cde52a8ce54aa1cc404bfdab8278eb7f81c17381c1ac62e72488b3b3a11fbaabb67a6084469d41232983f7146ddf01b5ddeb70f5fe46d4b914bebf649e5fe171d2cd7993fd3cd6bcaf663b47e86cf0e339422f68671396b2e6fd42395ec6d96f18df95e8057ef15d0957df6eee0bba55c13c9e171c4cdf2ebe63abfc458d99d03707bea3c64cc885ef0e86ef0e39f4ed35f79a3369ee600c82d4fb67f8cd5235653a2fc5710964b916c0e8622c8744d0f0dbe30762c4f11d64b996c0e8e2f890edb7cf7b01a32c570c8c2ede2dc5f1371ac388df18c6e3bc303af8566cd7a67e2b16efe9b50646a67736f1d9541b6074715edcd477f5f07cbe2dfcba1a97a85b168c496094e50e014617f7c6f15aa6318c785d24cbb5034617cfb0b21ddf09bf3d8ff7965d32663ab63bee8b92ccf6de4ba55b9e8ce71ae8dbc1b886292df03ee381b4e8e79627e3b90ffa7670df2fa5058e3378202df0d9a08b710f1341c3e77007e2c1e797b2dce1c058e5887140168c55c0f8af7bc5c038d0116355168c038151ec4702a383fbaf29c6815930e27d4a59ee2860bcd011e30559305e088cb2dcd1c0e8e25e6a02fc3686f1226094e58e01c68b1d315e9405e3c5c028cb1d0b8c973862bc380bc64b8051963b0e182f75c47849168c9702a32c773c305ee688f1d22c182f034659ee0460bcdc11e36559305e0e8cb2dc89c0788523c6cbb360bc021865b99380f14a478c5764c1782530ca722703e3558e18afcc82f12a6094e54e01c6418e18afca82711030ca7265c078b523c64159305e0d8cb25c4760bcc611e3d559305e038cb2dca9c078ad23c66bb260bc161865b9d380f13a478cd766c1781d30ca72a703e3f58e18afcb82f17a6094e5ce00c61b1c315e9f05e30dc028cb9d098c373a62bc210bc61b81f1060be360478c3766c138181865b97381f1a6f81953d7d283b360bc09786e8e9f27a5d94d59f0dcec9627f55dbd9b2cbe6e89df576a5b0c091a5ff75b806768fc3ca96d714b163cc2500acba166b7c6cf98d26c68168cb702cfb0f879529add9a05cf30d0ec568b66b7c5cf98d26c58168cb701cff0f879529add9605cf70d0ec368b66b7c7cf98d26c78168cb703cf88f879529add9e05cf88a05eb3db2d9a8d8c9f31a5d9882c1847024f75fc3c29cd4666c1530d9a8db468362a7ec69466d559308e029e9af879529a8dca82a706341b65d16c74fc8c29cd6ab2601c0d3cb5f1f3a4341b9d054f2d6836daa2d91df133a634abcd82f10ee019133f4f4ab33bb2e019039add61d16c6cfc8c29cdc664c1381678ee8c9f27a5d9d82c78ee04cdc65a34bbcb11e39d5930de65e189fb3bd9775a7c8d7754f77141e3eb2e0ca5b01cf69398e088717c168c13805196c37e12758e182764c158078cb25cc23163a67e1275e07b62fcbe53ed525dd0787d26bae5c9d84f027d4f72a4c5c4a0f15a4c72cb93b19f04fa9eec488b4941e3b5980c3c531c6891001f8de1118652580efb494c75c438250bc6a9c028cb613f89698e18a766c1380d186539ec2771b723c6695930de0d8cb21cf69398ee88f1ee2c18a703a32c87fd24ee71c4383d0bc67b805196c37e12f73a62bc270bc67b815196c37e12f73962bc370bc6fb805196c37e12f73b62bc2f0bc6fb815196c37e120f3862bc3f0bc607805196c37e120f3a627c200bc607815196c37e120f39627c300bc687805196c37e12331c313e9405e30c6094e5b09fc4c38e186764c1f83030ca72d84fe211478c0f67c1f80830ca72773966cc74fdf24833f71d75add2dc7d475d973477df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f771cee4fb5107be13e043a62263be0af2c2500acbdde5199b3523f294c5c7538e75475fdf22a8fbb72c3c458eea8ebe1e23a8bb30e41be3a379c088fbb8d7b1e98c8e754c369551f13cee88e7b12c781e079e271cf13c9e05cf13c0f364fc3ca9987a220b1e612885e5eeca03c647f380d1ebe8756462f43a168e8e9ed1337a46cf783018f3a10df78c79118fc9a6322a9e99f1f3a4347b320b9e99a0992c77b35bc664531915cfacf879529acdcc8267166836d3a29903c664531915cfecf879529acdca8267366836cba29903c664531915cf9cf879529acdce82670e6836dba29903c664531915cfdcf879529acdc982672e6836c7a29903c664531915cfbcf879529acdcd82671e6836d7a29903c664531915cffcf879529acdcb82673e6836cfa29903c664531915cf82f879529acdcf8267016836dfa29903c664531915cfc2f879529a2dc882672168b6c0a2192be35d79c0f8681e303ad631d95446c5b3c811cfc22c781601cf538e781665c1f314f03c1d3f4f2aa69eca8247184a61b9bbf280f1d13c60f43a7a1d9918bd8e85a3a367f48c9e313bc66fe501a3dfd69e9195d1c1f555c677689e6ae6bea3dea169eebea3dea169eebe7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee39cc9f733f1fb4e66fb8d996780c7c5376f1cd5b35cadf759bdaeaf62d44f69f59ca1d5538656a550e659d0ef3907fa15815f59b7cc8bbf6c993b11303bf29d3c345cc721507ff1f1a8a187f2ffbca3ba47b5f5cf3773df516d7d73f71dd5d63777df3ece7d9c17826f1fe73ece0bc1b78f731fe72cbe31df2aa83f6f97ef9faa75bc00ff2f82f2f25de1622833a54dfab77de0f72117befd3ee48f1585e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe77c718ef15099039ec0e00932f02c24e39946c633878c670c19cf30329e6bc8782e24e379808ca73b19cf44329e51643c3791f15c41c6733e194f7f329ee9643c7dc878e692f1dc49c6f30419cf70329eebc8782e26e379888c2749c633998c673419cf2d643c5791f15491f1dc4bc6d38b8ce76c329ef1643cf3c878ce22e31941c6f32419cf0d643c8792f1b427e3b9948ce731329ef3c8782ac8781e26e35940c633958ce70e329e5bc978cac978ae26e3e942c6730119cffd643c3dc878e693f1d491f1cc24e3a926e3194cc6730e19cfe5643c2dc978fa91f12c22e3b99b8ca72f19cf58329ece643cb791f15c4bc6731119cf83643cddc8782691f1cc22e3a921e31942c6732519cf00329e7bc8787a93f18c23e3e944c6733b19cff5643cb9f89e69363c25643ca5643c9790f13c42c633838ca72b19cf14329ed9643cb5643c43c9780691f10c24e3b98f8ca72719cf04329e91643c3792f13c4ec67318194f07329ecbc8788a087812c1d7c73049c0ff9f015b0b6359f5d9d7b91debffffa2b6b780655ed2f9969675bf0836f996ec4b966551a717a12e553a5ffecda6944ee8ab0ae6c55f0970bc44c27319194f07329ec3c8781e27e3b9918c672419cf04329e9e643cf791f10c24e31944c633948ca7968c673619cf14329eae643c33c8781e21e3b9848ca7948ca7848ce719329eebc9786e27e3e944c6338e8ca73719cf3d643c03c878ae24e31942c65343c6338b8c6712194f37329e07c9782e22e3b9968ce736329ece643c63c978fa92f1dc4dc6b3888ca71f194f4b329ecbc978ce21e3194cc6534dc633938ca78e8c673e194f0f329efbc9782e20e3e942c67335194f3919cfad643c7790f14c25e35940c6f330194f0519cf79643c8f91f15c4ac6d39e8ce750329e1bc8789e24e31941c6731619cf3c329ef1643c6793f1f422e3b9978ca78a8ce72a329e5bc8784693f14c26e34992f13c44c6733119cf75643cc3c9789e20e3b9938c672e194f1f329ee9643cfdc978ce27e3b9828ce726329e51643c13c978ba93f13c40c6732119cf35643cc3c878c690f1cc21e39946c6b3908ca7d2c2f38c231e79df5dd62df3cf90f876b01dcad57a5f7654a757f4ba5aebf50abff82b863233daa57fd5f30f5c56b8ccef13e0bb39af8046af38aa8b6c8f2263fba0ef171cf936c7e793f9179ab9eff686eff605e2bb83e1bb4381f8f671eee3bc107cfb38f7715e08be7d9cfb3867f2ede0da2089df4993a9c898af823c5e2fb8f8be9ca37a36b84efc2a46fd9456af1a5a99d756a550e665d0ef5507fad9ae3d655efc65cbdc898019e3a22c88372e5e8bbf4e49d5eff010d0f535435facd762479a461d43163773df51c790e6ee3bea18d2dc7dfb38f7715e08be7d9cfb382f04df3ece7d9c33f97e5de763bc6e2c471fad82faeb81d7c1ef529d2f8ad1af5ad712f05b041ce2af18cafc2f78aee9f779bfcfc7e5db1fdb7c9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8668e73332ffdc5cf023657fdf9a3623117ef121c4cdf51b1d8dc7d47c56273f7ede3dcc73993ef650e7c27c0874c99faf82d039e250e781cd533f56c63b951a7678c3a9542193cc62f7750cf22f02beb96f9e5c0235325f0b88883c66c73e45948c6338d8c670e19cf18329e61643cd790f15c48c6f300194f77329e89643ca3c8786e22e3b9828ce77c329efe643cd3c978fa90f1cc25e3b9938ce709329ee1643cd791f15c4cc6f310194f928c673219cf68329e5bc878ae22e3a922e3b9978ca71719cfd9643ce3c978e691f18c20e379928ce706329e43c978da93f15c4ac6f31819cf79643c15643c0f93f12c20e3994ac6730719cfad643ce5643c8bc978ae26e3e942c6730119cffd643c3dc878e693f1d491f1cc24e3a926e3194cc6730e19cfe5643c2dc978fa91f12c22e3b99b8ca72f19cf58329ece643cb791f15c4bc6731119cf83643cddc8782691f1cc22e3a921e31942c6f32a19cf95643c03c878ee21e3e94dc6338e8ca71319cfed643cd793f19490f19492f15c42c6f30819cf0c329eae643c53c8786693f1d492f10c25e31944c633908ce73e329e9e643c13c8784692f1dc48c6f33819cf61643c1dc8782e23e32922e049045f7ff73f01ff7f156cf28efa33607b43e79780ad85c5474b9d5f0eb6629d9775b409d3f31dbfbe6ed4c9d57bf9e8ab0ae6c55f0970bc41c27319194f07329ec3c8781e27e3b9918c672419cf04329e9e643cf791f10c24e31944c633948ca7968c673619cf14329eae643c33c8781e21e3b9848ca7948ca7848ce77a329edbc9783a91f18c23e3e94dc6730f19cf00329e2bc9785e25e31942c65343c6338b8c6712194f37329e07c9782e22e3b9968ce736329ece643c63c978fa92f1dc4dc6b3888ca71f194f4b329ecbc978ce21e3194cc6534dc633938ca78e8c673e194f0f329efbc9782e20e3e942c6733519cf62329e72329e5bc978ee20e3994ac6b3808ce761329e0a329ef3c8781e23e3b9948ca73d19cfa1643c3790f13c49c633828c671e19cf78329eb3c9787a91f1dc4bc65345c6731519cf2d643ca3c9782693f124c9781e22e3b9988ce73a329ee1643c4f90f1dc49c633978ca70f19cf74329efe643ce793f15c41c6731319cf28329e89643cddc9781e20e3b9908ce71a329e61643c63c878e690f14c23e35948c653991b9ea47ab75dfa5a07c0855315e49703cf6207fa38aa67397ed7e0ab18d7abb47ad3d0ea5543ab5228b30cf47bd3817e45e057d62df3e22f1f9915cf233a6ffb0ec423248c625bec9627b5df3e12349c32edb76f028f8b76cd513d53fbd70aa34e8f5874973218ab2b1cd4d3b6efc8fc0ad80ef9c6ac781ed379614d40b9c74818c5b6dc2d4f6aff7a2c683865dabf56008f8bf6c7513d53fbd74aa34e8f5974973218ab2b1dd4d3b6efc8fc4ad80ef9c6ac781ed779614d40b9c74918c5f6a65b9eee09a8b34c99f6af95c0e3a2fd7154cfd4feb5caa8d3e316dda50cc6ea2a07f5b4ed3b32bf0ab68367f6cc3666c523cf76843501e59e206114db0aa73cddcb1350679932b563ab80c7453bef48f7543bb6daa8d31316dda50cc6ea6a07f5b4ed3b32bfdae2bb2c88578b358dd0628d85674d8eb5107fd9322fcb4366afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866069d158f7cbb52581350ee491246b1ad74cb937a2fe8c9a0e15464cc57417e0df0ac72a08fa37aa6fa90af35eaf4a445772983fbd75a07f5b4ed3b32bf16b64336ccabf390d9ebdc3466c53353e7853501e56692308a6d955b9e543b36336838656ac7d6028f8b76de513d53edd83aa34e332dba4b19dcbfd639a8a76ddf91f975b01d3cb367b6312b9e593a2fac0928378b84516c6b9cf22453ef37ce0a1a4e99dab175c0e3a29d77a47baa1d5b6fd4699645772983b1bade413d6dfb8eccaf87ed900df3ea3c64f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce85a3b3e299adf3c29a8072b34918c5b6d6294fb7d47387d941c329d37387f5c0b32e769ef4730707baa79e3b6c30ea34dba2bb94c1fd6b83837adaf61d99df00dba1b933afce43661f1bb961f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503c73745e5813506e0e09a3d8d6b9e5497df7604ed070cad46f6703f0ac77a08fa37aa6faed6c34ea34c7a2bb94c1fd6ba3837adaf61d99df08dbc1337b661bb3e299abf3c29a8072734918c5b6de2d4faa1d9b1b349c32b5631b81c7453befa89ea9766c9351a7b916dda50cc6ea2607f5b4ed3b32bf09b68367f6cc3666c5334fe7853501e5e691308a6d835b9e543b362f6838656ac736018f8b76de513d53edd866a34ef32cba4b198cd5cd0eea69db77647e336c07cfec996dcc8a67bece0b6b02cacd276114db46b73cc904d459a64cedd866e071d1ce3baa67aa1ddb62d469be45772983b1bac5413d6dfb8ecc6f81ed906fcc8a6781ce0b6b02ca2d206114db26b73ca9fd6b41d070cab47f6d011e17ed8fa37aa6f6afb78c3a2db0e82e653056df72504fdbbe23f36fc176c83766c5b350e7853501e51692308a6db35b9ed4feb530683865dabfde021e17ed8fa37aa6f6afad469d165a74973218ab5b1dd4d3b6efc8fc56d80ef9c6ac7816e9bcb026a0dc221246b1e1f16291239e5283a7d4a2c5c1f2ade62b74be44ff26e0ff15c0e8aa3d5c6430ca3cc638f2bad6acbdc1d3ded0ec60fa56f5afd4f943f52f6eaf4a6064d85eed73a0590783a783a1d9c1f4adb4e8a7f387e95fdc5efd8091617b75001e07ed73f784c1a3a64ce71b5b1debe3a89ea9f38d6d815d773c0e49193c766f73504fdbb984cc6f83ede0993db38d59f10cd679614d40b9c1248c62c3eb94edf1f3744f183c6acad48e6d77ac8fa37aa6dab1b703bbeedb41772983b1fab6837a16815f59b7ccbf0ddb211be6d579c8ec756e1ab3e219a2f3c29a8072434818c5b60d78de899fa77bc2e05153a676ec1dc7fa38aa67aa1ddb11d8757f07749732b87fed7050cf22f02beb96f91db01db2615e9d87cc5ee7a6312b9ea13a2fac0928379484516c6f03cfced879d2e301218f9a32b5633b1debe3a69ee976ecddc0aefb4ed05dcae0fef5ae837a16815f59b7ccbf0bdbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219a6f3c29a8072c34818c5b60378de8b9d27fddc0179d494e9b9c37b8ef57153cff473875d815df7f740772983b1bacb413d8bc0afac5be677c176f0cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccdac7886ebbcb026a0dc701246b1bd0b3cbbe3e7e99e3078d494e9b9c36ec7fa38aa67eab9c39ec0aefb6ed05dca60acee7150cf22f02beb96f93db01df67866cf6c61563c23745e5813506e0409a3d87601cfded879d2cf4f91474d99dab1bd8ef57153cf743bb62fb0ebbe1774973218abfb1cd4b308fccaba657e1f6c876c9857e721b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec752e1c9d154fb5ce0b6b02ca5593308a6d0ff0bc1f3b4fb7f284c1a3a62263be0af2ef3bd6c74d3dd3cf1df60776dddf07dda50cee5ffb1dd4b308fccaba657e3f6c87e6cebc3a0f997d6ce486d9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a398196243f1d4e8bcb026a05c0d09a3d8f601cf07f1f3744f183c6a2a32e6ab20ff81637d1cd533d56fe7c3c0aefb07a0bb94c1fdeb4307f52c02bfb26e99ff10b68367f6cc3666c553abf3c29a8072b5248c62db0f3c1fc5cf934c183c6acad48e7de4581f47f54cb5631f0776dd3f02dda50cc6eac70eea59047e65dd32ff316c877c63563c63745e5813506e0c09a3d83e041e077197e229357864fe2302df6abe4ee74bf42f6eaf3a6064d85ea539d0acbdc1d3ded0ec60fa56f59fa8f387ea5fdc5e138191617bb5cf81661d0c9e0e866607d3b7d26292ce1fa67f717b4d024686edd521079a1dccf6f060eedb07334ebde6074ff3a283a879d141d4bcc86b4ea5b983e34b128f650130e05405f98f81e73bf1f3a4eecb7d9c05cf7780e7dbf1f3747554cf72b5deef027b5ceb555a7dcfd0ea6343ab5228830cdf73a05f11f89575cbbcf8f3cc9e398a19cf6d853501e53e226114dbb781c745bba1ea7e9e5e97acbf55983e39b2deaf8be72578afb8b55eaf7088bf622833a9ac9eedf79aad04fe2fdb4dd567bf6173f40e7357db733b99177f2541ceeedd66bc978c5ab878de94ed717fbf85e7abf878ca713f475ffb1cd53d9b677ffb2c3c31d6bd6bd473cfbdf1d73dd57e74d1eb92f5ab7df47f1ce954f3eeb8ef49fbd1c5a8733194195456cff69fd07ed8da0ad7fba69c939bfb668ba0be3d13ae326d379f097da5ed52ee03288f6d4e85fec5fdb302eaeaaa5d8cbac784eda2d976bbd4de7c2e69fa2e055d3e20d5ccf69c0275acb470571270633ce6723f9375db9e91551a3ab26986dbfa038b8efd2cdcfd08b819f7eb7e868e6c9a1d68bf1e6ce11e4cc0cdb85f0f367464d3ec40fbf5100bf710026ec6fd7a88a1239b6607daaf875ab887127033eed7430d1dd9343bd07e3dccc23d8c809b71bf1e66e8c8a6d981f6ebe116eee104dc8cfbf570434736cd0eb45f8fb0708f20e066dcaf47040d7564d3ec40fb75b585bb9a809b71bfae367464d3ec40fb758d85bb86809b71bfae317464d3ec40fb75ad85bb96809b71bfae357464d3ec40fbf5180bf718026ec6fdbab1fdf659f7eb3a0b771d0137e37e5d67e8c8a6d981f6eb8916ee8904dc8cfbf544434736cd0eb45f4fb2704f22e066dcaf27193ab26966dbaf1dbd4b98f5bb8d1f3ad5273dc6f48759f0bc0f3c2e62ca511c943beae792ea9bbad7d0ea43432b1cbb631fe8e7a02f4cc66f12883fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfcccf85d467cbe22e53e2061141b3e9372719f5fd5fd7cbd2e597fab300d3abadeefbed8fd26cb5187d67abdc221fe8aa1ccf1a7d4b35da7d94a82af6f371c8b1bb7e59ed8eb90de9666fccbbcf82b81faec051e07efe7a778f6193cfb2c5ae07ba7f1f84e8e72a371b25c7d1fef90a07e3bef31ea839aee8edd7f434d8b0c4d773bf69d081a6e4f61c0a90af2c8e3e2d9b0a37aa6da825d469d4c8d4ba14c27a8e72e07f52c02bfb26e99df053c32b5001e573118183c81451f992ac978a691f18c21e3399d8c671819cfb1643cd790f11c42c6732119cf03643cddc9782692f18c22e339858ce726329e23c878ae20e3399f8ca7988ca73f19cf74329e3e643c7792f19c49c6339c8ce75c329ee3c978ae23e34990f15c4cc6f310194f928c673219cf68329e8e643cb790f11c45c67315194f6b329e2a329e7bc9787a91f19c4dc6339e8ce72c329e11643c2792f1dc40c67328194f7b329e4bc9781e26e3a920e3398f8c672a19cf1d643ca791f1dc4ac6534ec6730c19cfd5643c5dc8782e20e3694bc6733f194f0f329e3a329e6a329e93c9780693f19c43c6733819cfe5643c2dc978fa91f1dc4dc6d3978c672c194f67329e33c8786e23e3398e8ce75a329e76643c1791f1ec25e379908ca71b19cf24329e1a329efd643c65643c43c8788e24e3b9928ca71519cf00329e7bc8787a93f18c23e3e944c6733b19cf09643cd793f19490f19492f15c42c633838ca72b19cf14329e5a329e53c9788692f11c4dc633888ca70d19cf40329efbc8787a92f14c20e31949c6731219cf8d643c8791f17420e3b98c8ca7888027117cfd5b4c09f8ff3eb0c93783de075b0bcbfae439b59457c7c5251dbfbeee169675efb630a04eef415daa74befc9b4d299dd05715cc8bbf12e0d84dc27319194f07329ec3c8786e24e339898c672419cf04329e9e643cf791f10c24e36943c633888ce768329ea1643ca792f1d492f14c21e3e94ac633838ce712329e52329e12329eebc9784e20e3b99d8ca71319cf38329ede643cf790f10c20e36945c6732519cf91643c43c878cac878f693f1d490f14c22e3e946c6f32019cf5e329e8bc878da91f15c4bc6731c19cf6d643c6790f17426e3194bc6d3978ce76e329e7e643c2dc9782e27e3399c8ce71c329ec1643c2793f15493f1d491f1f420e3b99f8ca72d19cf05643c5dc878ae26e339868ca79c8ce756329ed3c878ee20e3994ac6731e194f0519cfc3643c9792f1b427e339948ce706329e13c9784690f19c45c6339e8ce76c329e5e643cf792f15491f1b426e3b98a8ce728329e5bc8783a92f18c26e3994cc69324e379888ce762329e0419cf75643cc793f19c4bc6339c8ce74c329e3bc978fa90f14c27e3e94fc6534cc6733e19cf15643c4790f1dc44c6730a19cf28329e89643cddc9781e20e3b9908ce710329e6bc8788e25e31946c6733a19cf18329e69643c95643c2d0c1efcbf7a376cafcecbb7838ae1ff9375e7f2f67a5d52469e11ab7b15ef1a3655df9d8eeafb6e503f55c1fc4ea8afb0bf0b3cef3ae279cfe0317d9740be1234db61d814e33b8e1877188c32ff0e308a7e3b806787239e9d068fe9bb04f2fd40b3b70d9b62dcee88f16d8351e6b703a3e8f736f0bced88e71d83c7f45d02f9c1a0d936c3a618b73a62dc6630cafc566014fdb601cf36473cdb0d1ed37709e48780666f1936c5b8c511e35b06a3cc6f0146d1ef2de079cb11cf5683c7f45d02f9a1a0d966c3a618373962dc6c30cafc266014fd3603cf66473c5b0c1ed37709e48781661b0d9b62dce08871a3c128f31b8051f4db083c1b1df16c32784cdf25901f0e9aad376c8a719d23c6f506a3ccaf0346d16f3df0ac77c4b3c1e0317d97407e0468b6d6b029c6358e18d71a8c32bf061845bfb5c0b3d611cf3a83c7f45d02f96ad06cb561538cab1c31ae3618657e15308a7eab8167b5239e35068fe9bb04f235a0d94ac3a6185738625c6930cafc0a6014fd5602cf4a473cab0c1ed37709e46b41b3370d9b627cc311e39b06a3ccbf018ca2df9bc0f3a6239e15068fe9bb04f26340b3e5864d312e73c4b8dc6094f965c028fa2d079ee58e78de30784cdf2590af03cd961a36c5b8c411e3528351e69700a3e8b71478963ae25966f098be4b203f11347bddb029c6c58e185f3718657e31308a7eaf03cfeb8e7896183ca6ef12c84f02cd5e336c8af155478caf198c32ff2a308a7eaf01cf6b8e78161b3ca6ef12c8df0036e1ed0bb65774be0fd85ed6f9de607b49e77b81ed459def09b61774be07d89ed7f9ee607b4ee7bb81ed599d4f82ed199def0ab6a775be3fd89ed2f901605ba4f355605ba8f303c1b640e72f00db7c9dbf106cf374fe22b0cdd5f98bc13647e72f01db6c9dbf146cb374fe32b0cdd4f9cbc1f6a4ce5f01b62774fe4ab03daef35781ed319d1f04b66fe9fcd5607b54e7af01db233a7f2dd8eed2f9ebc076b3ce5f0fb60f75fe46b07da4f33781ed639dbf056cdfd6f95bc1f61d9dbf0d6cdfd5f9dbc1f63d9d1f09b6efebfc28b0fd40e74783ed873a7f07d87ea4f363c1f6639dbf136c3fd1f97160fba9ce8f07dbcf747e02d87eaef393c1f60b9d9f02b65feafc54b0fd4ae7a781edd73a7f37d83ed1f9e960fb8dcedf03b6dfeafcbd60fb9dcedf07b6dfebfcfd60fb54e71f00db673aff20d83ed7f987c0f6079d9f01b62f74fe61b0fd51e7a55d53edec9f74be2c88b79dfd32a89fcac0b7f85365feacf36d8c32b26c31943953772854cf38d4b74ca51d967659d9a41d7e056cd20ebf0c3669875f029bb4c32f824ddae117c026edf0f3609376f839b0493bfc2cd8a41d7e066cd20e3f0d3669879f025b95ce2f029bb4c30bc126edf002b0493b3c1f6cd20ecf039bb4c373c126edf01cb0493b3c1b6cd20ecf029bb4c333c126edf093609376f809b0493bfc38d8a41d7e0c6cd20e7f0b6cd20e3f0a3669871f019bb4c377814ddae19bc126fbcb976093b6f943b049dbfc11d8a46dfe186cd2367f1b6cd2367f076cd2367f176cd2367f0f6cd2367f1f6cd236ff006cd236ff106cd236ff086cd236ff186cd236ff046ce375fea76093b6f9676093b6f9e76093b6f9176093b6f9976093b6f9576093b6f9d76093b6f913b049dbfc1bb049dbfc5bb049dbfc3bb049dbfc7bb049dbfc29d8a46dfe0c6cd2367f0e36699bff00b687755edaeab6609367c56a2aff86138ec3d3027c094b55106fdb8f5315e4b1ee325592f1cc25e31943c6f30219cfe9643cc3c8788e25e339848ce735329e89643c8bc8789693f12c23e379958ce714329e8d643c1bc8788e20e379978c672719cff9643cc5643cb3c9789e23e339938c673819cfb9643cc793f124c8781690f12c25e35942c6f332194f47329ef5643cebc8788e22e3d941c6f30e194f6b329e2fc9786692f19c4dc6f30c19cf59643c23c8784e24e339948ca73d194f0519cf79643cf3c8785e27e3594cc6f32219cf69643c6bc978d690f19493f11c43c6f33619cf76329e2e643c6dc9789e20e3a923e3798a8ca79a8ce764329ec1643ce790f11c4ec6d3928ca71f19cfcd643c73c8789e27e3e94cc6730619cf6a329e55643c5f90f11c47c6b38d8c672b194f3b329ebd643c93c8781692f1d490f1bc42c6b39f8ca78c8c670819cf91643cadc8783e24e39945c6f32c19cf4a329e15643c2790f1bc45c6b3858ca7848ca7948c673e194f2d19cf4b643ca792f10c25e3399a8ca70d19cf93643c4f93f1bc49c6f30619cf49643c9bc9783691f11c46c6d3818c671719cf7b643c45043c09e008c026ff6f0936f90ecf7eb07daef37bc126dff0790d6c9fe9fcc3607bd0626b61e1138619609377653f079bdc9f79086cf2cec4676093f306f1afe65775fc3a7f0b5846fcb4b4f0a3bfcf2c5c92c7ed2dcb5405f16e6ff45515d8bf795764301e6c9ef7c8787691f17420e3398c8c671319cf66329e93c878de20e379938ce769329e27c978da90f11c4dc633948ce754329e97c8786ac978e693f19492f19490f16c21e3798b8ce704329e15643c2bc9789e25e39945c6f321194f2b329e23c9788690f19491f1ec27e379858ca7868c672119cf24329ebd643cedc878b692f16c23e3398e8ce70b329e55643cabc978ce20e3e94cc6f33c19cf1c329e9bc978fa91f1b424e3399c8ce71c329ec1643c2793f15493f13c45c65347c6f304194f5b329e2e643cdbc978de26e339868ca79c8c670d19cf5a329ed3c8785e24e3594cc6f33a19cf3c329ef3c8782ac878da93f11c4ac6732219cf08329eb3c8789e21e3399b8c672619cf97643cadc978de21e3d941c6731419cf3a329ef5643c1dc9785e26e35942c6b3948c6701194f828ce778329e73c9788693f19c49c6f31c19cf6c329e62329ef3c9787692f1bc4bc6730419cf06329e8d643ca790f1bc4ac6b38c8c673919cf22329e89643caf91f11c42c6732c19cf30329ed3c9785e20e31943c633978ca7928ca7858567bf231ef9568cac5be6f73773df3b0ddf3b0bc4f73b86ef770ac4f776c3f7f602f1bdd5f0bdb5407c6f317c6f2910df9b0cdf9b0ac4f706c3f78602f1bdcef0bdae407caf317caf2910dfab0cdfab0ac4f70ac3f78a02f1fd86e1fb8d02f1bdccf0bdac407c2f317c2f2910df8b0ddf8b0bc437f3f5b7fa4e98f455dea57f13f0ff0a607ccd11e37e8351e65f0346b1e1f7a82b1cf1445dbb5710f8565ac8bd2c79e69980ff5702a3ab98aa301865de16533b81a7d2114fd43d874a02df4a0b79175bfa5426e0ff38feb2ab98aa341865de1653ef004f3f473c51f74afa11f8565ac8bbcff2ce5f02fe8fe3adbb8aa97e06a3ccdb626a3bf00c76c413758f6730816fa5857c2b4cbe499380ffe3f88cae626ab0c128f3b698c2f1738738e289ba373584c0b7d242beb52bdfbc4cc0ff71fc26573135c46094795b4ce1f871431df144dd531b4ae05b6921cf82e51bed09f8ff3060741553430d4699b7c5148e7733cc114fd4bdc06104be9516c3755efa5825e0ffc381d1554c0d331865de16531b8067b8239ea87b98c3097c2b2d46e8bcbcc39180ff8f0046573135dc6094795b4cad039e118e78a2eebd8e20f0adb4a8d6f9b5fa3701ffaf0646573135c26094795b4cad019e6a473c51f78cab097c2b2d6a745ebe399780ffe3f8ef231c31561b8c323f0218c5b60a786a1cf144ddebae21f0adb4906ffbafd4bf09f83f8ec7ea2aa66a0c4699b7c5148e075deb8827ea1e7d2d816fa5c5189d97316112f0ff31c0e82aa66a0d4699b7c5148e5f39c6114fd4b3853104be9516f26daee5fa3701ffaf0346573135c66094795b4c2d039e3a473c4b0c9e25162d0e966fa585f4e55eaa7f13f0ff89c0e82aa6ea0c4699b7c5d412e099e88827ea59ce4402df4a0bf9b6f6ebfa3701ff9f048cae626aa2c128f3b6985a0c3c931cf1443d839a9403df51cf5372e13bead9402e7c47dde7ce85efa87bb6b9f01d75ff3117bea3eea5e5c277d47da15cf88ebac7910bdf51d7ebb9f01d75ed990bdf51d751b9f01d754d900bdf51e7b7b9f01d75ae960bdf51e71dbe3df7ed79dcbe0fe6b943a1b6e707f3187a308f25fedac05f1be4cab73f96f86b835cf92ed46b03df9ee7be3d97ebafa220fa7aec0d47be9719be651e9fb32c73e47b89e15be6f199c11247be171bbe651eef7f2f76e4bbd4f02df38b73e0bbbde1bb7d0e7d77307c77b0f876b0bd9389a0e1f5b730e05405798c81d71d68e1a89ee56abd4bf5babe8a71bdb6fb36e6fe520a6596827eaedb0e59b7d976e42333c645517cbecb13e043be4ba66cf2fcf815b049bbff32d8a45fc04b609363d38b609367522f804d9e593d0fb6313aff21d8e4d931f6d997e7ffdbc156adf3d8577c84ce6f059bf4a5c23ecad21f6e0bd8a44f23f68d957ea99bc0267d8bb14fa6f40fdf0036e9e38f7d01e53d8d756093776db00f9abc2fb5066c7b751efb3ec9776856816d86ceaf04db1f747e05d81ed0f99bc1f6a9ce7f09b6dfebfc62b0ddaff3af83ed773abf146cf7e9fc7360fbadce3f0bb67b75fe19b0dda3f3f82edb6f74fe3db07da2f3f80ed5749ddf09b65feb3cbebb73b7cebf03b65fe9fcd3609ba6f34f816daace2f02db2f757e21d87ea1f30bc03645e7e783ede73a3f0f6c93757e2ed87ea6f373c03641e76783eda73a3f0b6ce3757e26d8c6e9fc9360fb89ce3f01b61febfc1760bb53e79780ad85ce2f039b8c1989fd548a75fe0db0b5d279ec7f24dff79f04b6363a3f116c6d75be0e6cf26db8316093f1a06bc196d0f91ab095e87c35d8e4fc6c04d864fc93e1609373a961603b4ce787824dce7b86804dc6b31c0c36f906693fb01da9f39560936feb5780ed689ddf0f361973ec35b0c977ebf6824dc6627e086cf2bdea19603b41e7ff00361987e501b09da4f39f82ed649dff3dd8e41b9ef783ad4ce77f07b68e3a7f1fd84ed5f9df824dc6c8ba176ca7ebfc3d6093b1837f0336f9def32760eba4f3d3c17696ceff1a6c3296c8dd6093f1417f05b6ce3a3f0d6cf21deea9603b4fe77f093619efef1760936f0c4f019b8cebf673b075d5f9c9604beafccfc0d64de72780adbbceff146c3d747e3cd87aeafc38b0f5d2f99f80adb7ceff186c7d745eda19b53fabfd7c9f9eaf0ae23b2f53fede0f1a4e99ae0d840179e23cd72e051ef4b527f6ba2753e7f5b2dfb7d0eb9518da03be77c5ee3b7d4db15bafab955eef2ec3773194394b370e6ab977e1ff555007590eef63c9ba6599f361d9f78c75b7d7f5ddeda8bebb0c26e1de0d4c52e6dc53eacbfe50e7dbc23231b2a5ae8f25d602d010a72ac80b831bad92e578dedb189eddc0b327769ef4f5ba8b98c07d2beeeb75f33eae196ba5506617e8f79e03fd705f9775cbbcf8f3cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccfac78f6e93c3e579672fb4818c5b607785cdce7c7e7b0f8ccebbd53eafdee89dd6fc3e77badf57acb8d3a174399afe099d35e9d2f81ffcb768bda960e9e1366dc96e2af04ea83cf82f639e2d963f0ecb16821f9b2d87c2747b9d13859aefab2a867ec7b0d5df7593475b5bfeed1eb2a3234c5fdf57d83079f8d9600ef07fa3701ebf900eae0601fcf1817e20ff7a53d6093fcfbc0e8623be3b144da03791e2efef0b9f8af8de7e2f16ffb64b9cb76439ef99bcfdbb1ae52e6f7d0f67da6f3d837641faceb1f96ffcb94e939b5e8a7eabc23fe3aa7b6aff46994edbbc3e2fb6d608dc9778377688a74123f622f86fcdfa13f8794133d446b61c7f1ca91dd5cee7d63b95228b3d352ffaa20defaef30787618cc2a76be8038fb071cff5db5493b23343a1f3492327b40a3bd8e78f6183cc221fe5419d9fe6d8c32b26c3194f99fd046a9ba483b2ff5c4be2d780c70751c135fb26e99b79d1bef0646b38e2a3e061d5dcfbb2776defceaffd5a62cfd8bed7a5cfdbf64ddedf5b2c21118eb2f87f5ff8b2b883eb6fc6bfb96d5afdf65ffb2bd469d856537304999f665f5652fd1f96ccef50fd6755bd4b9fe4e073c89a0e1b5b79a321ddff118f32efc5fca947fb3a9aba37a96db8e5def19752a85329da09e0ece6332be0bbc037cbbd8e6a8859c43ed32b42886321dcbd2bfd27644e988d7aabb735297a4f57cb0dc521729d3a9acbe2e6dc11e2793cbed86e7596abd7b2c759532e796d597eda2f309d84ed896f6b3fc5fa64ced018ec5b32dfe3aa7b6afbcf326db779bc5f75bc01a93ef06df0291f37df123f662c85796d5979572a287682dec6a1f9177fe90dd5c6e97b15c2994d96ea97f55106ffdb7193cdb0c66153b5dcbeaf312472edbcded111a9583465206ef1fcbb11ddfbbb31df7f738e28e3aeeef0146b3ddc47317976c7b0d36f31eaaed7c50cac8b2783e786559fa57b5b3094b59f3deb08bfb98f80e6a00f5088cbaca8431e0e0dab03b5e3b493b257eba807d8fce8bce5d0ced8aa1cce0b2f4afc3f36eebbd4bf3fa0eaf2984dbdcb7f0dd8fa165f5dc3876e21efd5b02b68ff4afa3ebb4eeb67b86c261bb6738a2ac9e1d9715ae0f2d7531af915b045fbfa7fe955116efbb655acecc9be3502a7d3f32cad9fce0354f6cef6a742d2f47a61681fd7ec1fb067b51f0f53137653fc09833efa37431d683f751eacad2bfd2269965559bf43f8eacd747b6a36887ed09c6e4fbc058a5f3e5df6cea6aabbfcc8b3fc5f8815107376d57fa7da56cee03ef051e176dbba336ba1c8fb16d635b6f9f6adbf1ff7d43ab1c3eafb51ef3cd67ee6d8d7c3cbe9335b6fb4f362d7659785c3d4789d26297c5777c5af41c653b7ed8b4c865df87282ddeb3f88e518b5abcef99498b772d3c2eee4565d2e25d8beff8b4e8559ee9b9066ab1d3c2e3eade439416e22f5be6f70898db1af9787c77afb6dd27b369b1c3c2e3eaba394a8b1d16dff169d1b527dea3cba4c53b169ef8efcf65d6e21d8beff8b4e8dd07efe165d2e26d0b8fab67ba515abc6df11d635c8cb6ddcbb169b1ddc2b33dc75a6cb7f88ef1fcb0a7ed5e9b4d8b6d161e07f75d336ab1cde23b462d46e27dd74c5a6cb5f06ccdb1165b2dbee3d3a2ba87ed9eb04d8bb72c3caeee094769f196c5777c5a8cecad7c6f6984165b2c3c5b72acc5168bef18afa15271b1b9115a6cb6f06cceb1169b2dbee3d3a22675aeb5a9115a6cb2f06ccab1169b2cbee3d3a23c754cddd8082d365a7836e6588b8d16df31c645ea7a724323b4d860e1d990632d36587cc7781c49c5c5fa4668b1dec2b33ec75aacb7f88e4f8bdad4fda7758dd0629d85675d8eb55867f11de33d97545cac6d84166b2d3c6b73acc55a8beff8b4e8963aa6ae6984166b2c3c6b72acc51a8beff8b4189d7a26b6ba115aacb6f0acceb116ab2dbe633cef4cb517ab1aa1c52a0bcfaa1c6bb1cae23bc6f3ced4fd8b958dd062a58567658eb55869f11d63db993aef5cd1082d56587856e4588b1516df319e77a6b478b3115abc69e17933c75abc69f11de37967ea38f24623b478c3c2e36a0c94282ddeb0f88e312e526de7f24668b1dcc2b33cc75a2cb7f88ef1be56aaed5cd6082d9659785c8dd710a5c5328bef18af4752f7f89636428ba5169ea539d662a9c5778ccf8a52e7e04b1aa1c5120bcf921c6bb1047cef8ddd77ba3fb7f890be58e7195a144399933ba67fa52f56948eb20eec578675793df6baa4fb952d8ea8cbeb501729733ad4a56de0648ca2ee8eea9a8a99d7f4baa46ffa0796ba4a99b33bd697edacf309d8261fc2bafa5afe2f5391315f0579d14fd5f995f8eb9c8a55194346b6ef2b16df2f016b4cbebba2ef229dc48fd88b21dfa7637d5929277a88d6c2aef69157751ed9cde59618cb954299572df5af0ae2adff2b06cf2b0673eabd0788338923376d579ae9d5088dce038da40cf6d9fbc0118fd9875038c49f2a23dbbf8d5106fb504a990ba08dc27ea552cf44f0f57e938edab2aec82eeb9679f1570ab6bdc068d651c5c727d0f753c68a907124944dc685e806ebe965d8545d7b3baaabf89275cb7c6f6094712a7ae59e31d958c69e06a3e2e9eb40331c7b43a64cc78bbec0d3c7018fa37aa68e4315469d7a1b752a8532f86e6385837a16815f59b7cc57806f17db1cb59063f2d98616c550668471fe18a5a3ac43c56f2f4b5dfa3bae8bac5bdaa5fe39f05d69f8ee61f84e040db7731064debf2a81b99f0366b5de01f1afb71ccfdb24a6c44f0fa8d340d020ae3ae1bae43c6fa0a16d31e4a7c1799e9493b272fc127615cbb22d91dd5caeafb15c2994e96fa97f55106ffd07183c030c6675ecbe13ceed1cec0fa918e86f70c87c0fd06e408476fd413b2983c7bf9e8eb4eb67f0c87c4fe091739c0ab0c9b982f027e0ffdd72c06db67b15166eb1e138713d2d8c3de2674c9debf4341865be07308aad1ff0543ad2ccdcd6671bfae071b98d5146962d8632b3e1d898b09455fb5da7a2fa7ab5d4f6d8de1dd36d7a6b077ae1388d01e813181aca240c6d83fab11ce3e46917d48fd538656adde491778cbe7e74fad1a3a0151b98f85b64a9460bb061bea5c516040d87a42c069b0c49d90a6c2d0c5970284c292f43dab9900bf59075171b9c6d81254edf389ca74c9942a70df0b80865153a32a4a70e9d9b278f9d3a1ae3a395c1d994d851ff6b99a15cd4ba5c6d07739fa8827933068b1df96f09f5ad8279f1a7b64da9ce4f1c39eaae8193ef98367ef484a953502873c7c67c51d0700398bf5182bbdae93000b0c2d838b432ea850d86fc4f364cbbf839bbe398b9a63601f893a91de8768803ddd4fa65ecdb5123c78dbb765af5b8b1a32e993661d4d4b17513706bb635948bdad2f2ffd660b335f158564dd86ce1b26d2c36db84a30cb7059b1cb90e019bf0b4035b4bc84b7973cb3809d74eb07ed9a5d4ff9438ad74c5db04f521208763d5aeaafd577d3e569d06a9a18ed5d0c66a73aaa18bd51d433534b1fa8a9d1a7a580d35ac86163e3e480f1dac860a3e29480f05acbe765116a487f63d35480fdd7b7a901e9af74ce0fb0e309f15a44fbbd4d0ba9d83f4d0b9ead6a57a755d7de64dbd5baf4edfd56d0175caab2ef1d4e9a73aed549717eaf685ba95a54ee9d4e9b23a1554a76fea726480d67a60982e08d38561ba284c1787e992305d1aa6cbc2747998ae08d39561ba2a4c83c2747598ae09d3b561ba2e4cd787e98630dd18a48777be29480fbfae867fbe25480f0d7d6b901e36fab6203da4f4ed417ab8e991417a28ea51417a98ead1417a08eb3b82f4f0d66383f430b97705e9a176c707e9e17ad570d86a986c357cb61ae6570d09ac861456430dab6189d510c66a08643534f27d417ac8653564f383417ad8e719617a384c8f84e9d1307d2b4c8f85e9f1203d3cb81a367c66901e665c0d3f3e27480f573e2f480f6fae863d57c3a1ab61d2d5f0e96a587535ccbb1afe5d0d0bff7c985e08d38b41fa91847a14a31e51a8dbffea3198ba45fd7a90be75be34483fe2568ffc551708d5254475915919a4bb50a92e65aa8b9dea72a8ba60aa2ea9aa8baeeab2acba70ab2eedaa8bbf7ae541bd02a25e8951af08a957a6d42b64ea953af58aa17a4d54bd76a95e2356af55ef09d2b7c5f705e947a5ea76b87a34a06e99abdbf71f87e9db413a26bf1ba6ef85e9fb61fa41987e18a61f05e9618dd570c76ab86435b4b21a86590dd9ac8672564341ab61a33f09d2434faba1ab7f17a487c4fe344c9f85e9f3203dbcf61761fa6398be0cd39fc2f4e730fd254c7f0dd3dfc2f46f61faf730fd4798fe1ea67f84e99f41fd30dbd8901caf5b1f7d05138c9c3a75f4f88953cba6d6958d9f366eead889e3ee2d9b3e76ea98b2babb474fae1d57371d17fe8e5e58c6081f3879f2c87bcbc64ea8197d4f59ddb4a96575b565d575d326d4343888ff452f74e2d73d8eaca98976f65fdf84f4ff34d1e921ba5d94d1d72fcf5cb792964d10e4f0a62cd4b365d32a34591fc1e452f786f47970d994717553cbcacb26847fc3036fddf4d1355dcaf07f534291a74c2d9b3275e4e4a965b593ebc69775ed82eb7da85d132af1dfeddcc09c717cd3c4e9a4bfb3d4a410fbd5294d50e03f4f691a69ebb26f40daaeac694ecbca9a50c3339bb2d0154d24bcb12c529629d3aaa74e1e396a6af4c2b77c93856f6f4a352734b19a27756c82b3d39ab2d0c08e4d23bcbd29ce6665e12cf8ffbd834b6784550600", "isInternal": false }, { "selector": { "value": 2603445359 }, - "bytecode": "0x1f8b08000000000000ffed9d77741cc791c6679118164b1024c11ca04433015c2c12012630674a9464e5409004455a24419150b22c4bb224e79cb3e5749673ce675db4efce77bef3d96739fb9c6dc941f7cf3ddfbb7bcfefba67bb8c0fcd9935169a026bb035ef15b7a7b677ead7df54f70eba67874f054190098a5bb5b18b8273377abfcfbde69fded696e0b1f29c9c99947056a584b33a259c3529e1ac4d09675d4a3827a58473724a38a724c869d9aa82915bd2bc5319744d9a319b324deb53a0692e659a4e4b81a60d413ac6a8e929e16c4c09e78c9470ce4c09e7ac947036a58473764a38e7a484736e4a38e7a584737e4a3817a48473614a3817a58473714a3897a484b339259c17a484f3c294705e9412ce8b53c27949829c2b8173a97b7d867b5de65e97bbd715ee953eb3cabdb6b836d6b8fd5663ab2d9bb136efbd82b176631dc63abdf7ba8c751b5b63acc7bdd7ecdeeb35b6d6d83a63eb8d6d30b6d1e9b0c9d866635b8c6d35b6cdd876633b8ced34b6cbd86e637b8ced35b6cfd87e63971abbccd80163971bbbc2d895c69e69ec2a63571bbbc6d8b51ecb75c6ae377683b11b8ddd64ec6663078df51b3b64ecb0b123c6068c1d35768bb163c68e1b7b96b15b8d9d3076d2d8296383c64e1bbbcdd81963678d0d19bbddd81dc6ee347697b1bb3dcd9e6dec1e63cf3176afc7f95c63f719bbdfd803c69e67ec41630f197bd8d8f38dbdc0d80b8dbdc8d88b8dbdc4d84b8dbdccd8cb8dbdc2d82b8dbdcad8ab8dbdc6d86b8dbdced8eb8dbdc1d81b8dbdc9d89b8dbdc5d85b8dbdcdb1504778bbb177187bc4d83b8dbdcbd8bb8dbdc7d87b8dfd85b1f7197bd4d8fb8d7dc0d8078d7dc8d8878d7dc4d8478d7dccd8c78d7dc2d8278d7dcad8a78d7dc6d8678d7dced8e78d7dc1d8178dfda5b12f197bccd85f19fb6b637f63ec6f8dfd9db1bf37f665635f31f60fc6fed1d83f19fbaab17f36f62fc6bee669feafc6fecdd8d78dfdbbf37dc3bd7ed3d5a579b1ff30f62d577edcbd7edbbd7ec7bd7ed7fbccf78c7ddff3fdc0d80f3ddf8f8cfda72bffd8bdfec4bdfed4bdfeccbdfedcbdfec2bdfed2bdfecabdfedabd3ee15e9f74afbf71afbf75afbf73afbf77af4f19bbaca9589e1c0c6f7d41426354c7d1bc5d5321f197062337ab45b57b8f5e9b9dbfc6edd32b6957ebf66b3d7f9ddbaff38e33d9ed4ff6fc8d6ebfd1f3cf74fb333d7f93db6ff2fc73dcfe1ccf7fb1dbbf18fcd900e65c9ddffaaa9d2b033ecad72af0d53a5f35f8eae870e09be47cb5e0a3f35b07be29ce37097c539d6f32f8b2ce3785b43456ef7c7d4152b992efb7c7cd257d5cb70e352d79dec3f6b80d4cbcd393e71db0c76d64e0b5f931c31d6b3ae4cd4ce76b04df2ce79b013e3704fda9cf59df6ce79b05be39ced704beb9ce371b7cf39c6f0ef8e63bdf5cf02d70be79e05be87cf3c1b7c8f916806fb1f32d04df12e75b04be66e75b0cbe0b9c6f09f82e74be66f0d13d2e1780ef62e7bb107c9738df45e0a3b1f662f0d1b5e125ce67c789c919f88cf3d318157e86c667f02da3b1197ccb695c06df0a1a93c1b71262936f158c2be46b713e1aa3ec7bbdaedc1724d5270a619f589bf471cd91ed71d7277fdc70dd6e4330ac6b1fc4590b5a6d74e504ef0d6ac3d819671487fc3550de0575a91ee941df33c46ebf4fd6b9f2c6129febf53e97833aeb22dadf1724dbfef51ecf7a8fb916dacf93b3ed05cdd9516f65e7ecd550d7cf3dbae6998839bb17381872b64b7376d45bd9393b0075fddca3ebde8998b3d7010743cef6f3e46c21af395b9c230b82e8dca3bf7d2662ce1e038ee473b6537376f45bd939fb00d4f5738ffefe9d88397b0770249fb3ddfd7a6d30eaadec9c7d05d4f5738fe6622662ce3e041c0c393ba0e3eca8b7b273f66d50d7cf3d9a179c8839fb6ae0483e677b9872b65d733628ae77064174eed11cf544ccd9478023f99c3dacf3b3a3dfcaced9cf435d3ff768bd6422e6ec475cd9ae337cc3ad332c04df379d6f11f0269fdb473a9872bba0b95dbc0f2408a27394d6ee26626e3fe6ca368f1f877b0fc8f76de7bb007cdf71be0bc1f75de7bb08dac5d007fab50f8c7a2bbb0f7c1feafab94cebc813b10f7c1d381872f6b0e6eca8b7b273f609a8ebe71eddd3301173f647c0c190b3039ab3a3decaced93f405d3ff796b9f244cc59baafd45e2ffcd85d2fac00df4f9c6f25f87eea7cabc0f733e76b01dfcf9daf157cbf70bed5e0fba5f3e5c1f72be76b03dfaf9daf00be279caf1d7c4f3a5f07f87ee37c9de0fbadf37581ef77ced70dbedf3bdf1af03de57c3dce67d7bbe8deabaf3a9f3db7a4515f90ecb9a57b2ce9d8b4bf6a1c623778b11bc63176a317bb3122760b43ec2cc4a02de3edf741b98597279f0b46fefe8362ad4e3e56bb6d7b6b30fab6af069e3c43dbb31063343c79e0694b9e27bcd7b790fc71c373dcea699a8558add0ae7686766520161d9bf6295e0e7c387eb747307624cf58c8402c3a36ed770023f9f0fb84bed7a9ffd8efc3a599615e86be145e1361bc3ee0a0783550e7f7b386ebae706cf5f03e7eb7b6793ea6bc0cf38262d1b1699fe2d5437bdac69fb1305ac6bcc7c835466420161ddb8f8dfdbd65fc351bd579cd81ef3c8c4985b18e49f5c0361ed72971e75a4a6c8eefab0cc4a0b18d34a77835506776f570dd1d30ee32f4bf42b9d76f381e249fc7853cf6ebd1f0b4030f47df67eaaf79fcdeff63906cae757a5ab5795ae5a04e07e8d7c9a05fa9eb108aa7cccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccf299f1fe0b5cdfa47aab843092af003c1cf3fce1f3a3dcb1e8f8765de73bb0ae93fcba45218f6b96748fe172afcd3550e7c9cc30db0f603ddd5f1bc435cd55bcda8dea3e8bfae0dcb558ce35c4b875e0a8f5cbe6c462170e73adb7d967a8d8e790b57abaae8ad094e13e95119a663c4df13ec5951e8fcdd379d5c36c1c6b7fe5ae45a256544e726d0fef31e03d2fc5f18372a12a18397ee0f74c57e2b147ae61d27a799717bb06eafc4f66f8dcac81f7fb8273ef79b275babd63d36796c367bbbd6337b8cf12479d77fc56f82cd5f93f1853df5e15fc49338efb3f705c0ea0adb8f54119d7cd93ff1e2eaee3b797c1d3093c1ce30cd3f5461efb40d2ebf8dd9e5651d73154a70bf4eb66d02fea5a94f6299e322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb67c6df8a126b16ea1584308ed3bd0fe17a063dff05d7a65e5a351c977b1d8ed69c56786dae813a5fab1a667ba52bd707e7deef10772e19d6f34a9e4b8a570fedc1b520aedf7377783c1d115a50b939b1d8c575fce4351e5ec76ff7742d4468cad55f718d1535c5fedae6f1e0da687d70eebd255938ce78dc3b149717140ffb5207f8a88cbf8fe638cff85de2dfd743f170fdfa51a76d43c075ee0b79ce7183d6e669adbe3da2ad54e7c330f67dd495f11e0ebc77e4b188f7692bb54e4dfab13ccb2e5f5cf7a567c0d1f9ed8d88bd0e58138add86b133ce280ef96ba0fca5aae1ba548ff420ad89ddf6117a2618b2fb9f6bf33e97833a3d11edef0b926d7fafc7d3eb31dbdcf904e4d963f0fdcf3526f5c468b41c34a23a781dc4754f9e3f46faf737e27d7b93bc3a78cd4275be026354dcfda351f71cae616a5fdc3d87140faf8d3b81d16fa37f9f67a5dfa7f5388c1749dfa7f538e410dea71578c75f01c727ae4941fc770bd5f99e777cff9a9c3e83f781519d1fc278d1e0ee59ac0fcebdfec67ba6c6e3efabb8fba4291e5ed760dffe736dc7be99f4f713e604b2603e519d5f79e7ac3b867b75c4679f8cf92c69d5e2caf8f78baf9fd5a1073ed397880ec53edfebb585f2ba07da4275fecbbb064cfebaa5780d987c5b475e93d038d011d156aaf3dfd0d7fe00d778749e70bcaaab3ef77dda4a5d03927eb6cde3fd7c608c2de1f9c0b5d5c375fde7fc92d6e53e1fb8cbfb9cc4e703ff2fe4591ddc87ce3556af8bd16805684475f0b741f43d82cff28dfa8ee1bab73fee3b26ea199438b637548f3f9b3faf16758d4075e8b3788d30cb3137389dfdbafe7c217d5f2679df30fe56a215e2e26f255a99f4cc836e7db08fd705e733769e2976dc33a7f3e3103bee99d3e311bbd18bdd388eb15573d55c92e60ccf440e7f7f86cf2cb55ba9eb5262c8c1e7aa52c0589d02c69a1430d6a680b12e058c9352c03839058c5352c03835058c59603c9fdfed0cfa14c6aa0fd7f92a75ad81b15b98b428e7ffef60febf544a5efb606c86bfe9422d5a82d16b817fe7713cfba1dcffeb8518f0ff2e989102c69929609c9502c6a61430ce4e01e39c1430ce4d01e3bc1430ce4f01e38214302e4c01e3a214302e4e01e392143036a780f18214305e9802c68b52c078710a182f4901e352654c8471252f6361ac8c9687e3fffc7b3affe718034f3eea9e53a6df9e94fdffad313f9fb46daccf8dc37b4b78ff4fb8a7f76c3b8e7b47ca7db65da9ff6f9589b1305646aefbd8f1773ca3e1c1df4546fdb68681b1305646aedfbfe06ff446c3d3059a754668c6c058182b23d7bd72e5decb89bf4deb8ad08c81b1305646aedf3c648391f737ff391efc1d447784660c8c85b13272dd979c8518a3e1e901cdd64468c6c058182b23d36fdb42cd7acae0c1df80f54468c6c058182ba3e559cba4596f193c6b41b3de08cd2431224fd2cfc9ee8d88c5f19bc172db4e0cc83825058c5353c088f749708c5fa5ee93e8e5d5a730567db8ce57a9fb243036c3ef63422df0f7107f4e8bf5bc3c25ef93c0d81b98b4c0dfabfc392d36000fc7ef67b21063343cc49083cfcd4801e3cc1430ce4a0163530a1867a780714e0a18e7a680715e0a18e7a78071410a1817a68071510a1817a78071490a18f16f55866bc5927fbf6c98e0b1e3fe5699e8b1e3fe2e99e8b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cd7349b1d330c7af8c138f11799a93e3c963db31569f80b6f745f06498da8eb13609683b31a48d71630a18d7a68051752cde83381646cbb399896753193c9b81670b13cfe63278b600cfd6e479c29cda52060f31e4e0736b53c0b831058caaa3ea28895175ac1c1d955119955119cf07631ac670654c453e16c6ca6879b625cf136ab6b50c9e6da0197dae8d97b1305646cbb33d799e50b36d65f06c07cdb64568c6c058182ba3e5d9913c4fa8d9f63278768066db233463602c8c95d1f2ec4c9e27d46c47193c3b41b31d119a313016c6ca68797625cf136ab6b30c9e5da0d9ce08cd18180b6365b43cbb93e70935db5506cf6ed06c5784660c8c85b1325a9e3dc9f3849aed2e83670f68b63b423306c6c258192dcfdee47942cdf694c1b31734db13a119036361ac8c96675ff23ca1667bcbe0d9079aed8dd04c2ae3da14306e4c0123b38e85b1325a9efd4c3cfbcae0d90f3c9732f1ec2f83e752e0b92c799e30a72e2d83871872f0b9b52960dc980246d5517594c4a83a568e8ecaa88cca581e635f0a18f55c2ba3544686bfaf4afe86e6d2091ebbc18bdd5021b1e37e4333d1636b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae792621f483e76a1dc67cc1c001e8e67de30b5336f8f7bb93bd61f13d4cf6a7585a7d5a59e5639a87339e87705837e19884bc7a67d8a572ef333043033c52e4c33c79802eda7181b3d3d6cfc2b99da1e37d65f39c163c78df5133d76dc583fd1636b9e6b9e57426ccd73cdf34a88ad79ae792e2536966b83e1eb767afea93dc633e1fd8cc76ab71aa873d9a4e26b43a07d8823b6f621fdaea884d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9bc3cc77ca81a079ec0e3094af06c10c6b35b18cf0e613c6b84f12c16c6d3298c67ae309e82309e19c278b60ae399228c67b9309e6a613c9b84f1e485f1ec15c6b34418cf0a613cf384f1cc14c63355184f8d309ecdc278560be3d9278c678f309e5e613c4b85f1f408e3d9268ca74b18cf7c613cedc2786609e359298c272b8ca755184fad309e9dc2785a84f12c13c6b35f18cf3a613c0b84f13409e3a917c69313c653278c67bd309e5dc278b60be3e916c6b350184f87309ed9c2785609e399268ca74118cf16613c9384f12c12c6334718cf74613c8dc278260be3198fe70d95c39311c0930dce7d265916de3f00be2aefb376bc6a6b1a7eff2ae7af82cf5cedcad511c7be0a7cf4dbf0ab233e8b3a5d056de973e5fcd3db429d30561fec53bc7ae0b85a08cf01613c9385f1340ae3992e8c678e309e45c2782609e3d9228ca74118cf34613cab84f1cc16c6d3218c67a1309e6e613cdb85f1ec12c6b35e184f9d309e9c309e7a613c4dc2781608e359278c67bf309e65c2785a84f1ec14c6532b8ca755184f5618cf4a613cb384f1b40be3992f8ca74b18cf36613c3dc278960ae3e915c6b34718cf3e613cab85f16c16c653238c67aa309e99c278e609e359218c6789309ebdc278f2c2783609e3a916c6b35c18cf14613c5b85f1cc10c65310c63357184fa7309ec5c278d608e3d9218c67b7309e0dc278aa227818feffcb9087ee5fa363d3fe0121b119ce43f8ff7e5ec3d4a66bddb1eadc71899fe2d5409debdc8581bd1f053f4b5cfefd8678efdcb5a0d1b54c6da1f391f1ce0f73ec02de57190043e0e91344f070dc8fcad4ce117998e0ff3f9bb75a5de769e59fbb1cd4b906f4bb8e41bfa8dcfe531f70af6964b63cf4dd41ac59a8b7410823f9aee4e509fbed8660e456aadf5e073c1c6318533bc3fe75bdd7a60d11ba531dccd5eb19da19d57768ff7a380f6963b63c9b5c9958b3506f931046f25dcbcb13f6af4dc1c8ad54ffba1e7838c61fa67686fdeb06af4d9b2274a73a98ab3730b433aaefd0fe0d701ed2c66c7936bb32b166a1de66218ce4bb8e97a7230b6da6ad54ffba017838c61fa67686fdeb46af4d9b2374a73a98ab3732b433aaefd0fe8d701e945999a3982d0ffdc68458b3506f8b1046f25dcfcad391cf429b692b358edd083c1ce33c93eee1387693d7a62d11ba531dccd59b18da19d57768ffa688d8cd41b25adc3c0a2d6e8ee0b9799cb5a078e5325f934266d559758e63569d55e73866d559758e63569d55e73866d559758e63569d5567bba9ceaab3eaac3a27c1ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc72c4167cb43cf8821d62cd4db2a84917c37f0f284bf0bda1a8cdc32de7e1f946f069e1b19f4616a67780ff941af4d5b2374a73ad8bf0e32b433aaefd0fe41380f07cb60be2985ccaaf3d8982d0f3d2b9658b3506f9b1046f2ddc8cb138e63db82915ba971ec20f0708cf34ced0cc7b17eaf4ddb2274a73ad8bffa19da19d577689fe229b332c7315b1efa3f6c88350bf5b60b6124dfcdac3c85f0f78ddb83915ba971ac1f780e26ce531cc718740fc7b1435e9bb647e84e7530570f31b433aaefd0fe21380fe530df944266d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d2b4767cb43ff7708b166a1de0e218ce43bc8cad31eae3bec08466e196fbf0fca8780a73f719ee2ba0383eee1bac361af4d3b2274a73ad8bf0e33b433aaefd0fe61380f139df9a614326b6e8c0fb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb384dcb03c3b5d9958b3506fa71046f2f5f3f284cf3dd8198cdc4addb77318780e31e8c3d4cef0be9d235e9b7646e84e75b07f1d61686754dfa1fd23701e945999a3982dcf2e5726d62cd4db2584917c877879c2716c5730722b358e1d011e8e719ea99de13836e0b5695784ee5407737580a19d517d87f607e03c28b33247315b9eddae4cac59a8b75b0823f90ef3f284e3d8ee60e4566a1c1b001e8e719ea99de13876d46bd3ee08dda90ee6ea51867646f51dda3f0ae7419995398ad9f2ec716562cd42bd3d4218c9778497a7908536d3566a1c3b0a3c1ce33c533bc371ec16af4d7b2274a73a98abb730b433aaefd0fe2d701ed2c66c79f6ba32b166a1de5e218ce41be0e509fbd7de60e456aa7fdd023c1ce30f533bc3fe75cc6bd3de08dda90ee6ea31867646f51dda3f06e7216dcc96679f2b136b16eaed13c248bea3bc3c61ffda178cdc4af5af63c0c331fe30b533ec5fc7bd36ed8bd09dea60ae1e67686754dfa1fde3701ed2c66c79f6bb32b166a1de7e218ce4c3ef8bfd4c3c398f2717a1c5448cdde0c56ea890d88d5eecc60a89ad79ae795e09b135cf35cf2b21b6e6b9e67925c4aed45c53cd2b53f3cc79d43c731e35cfa8e62235ff6372b13b715ca98258c798da895b1f94717e8eb635c278160be3e914c63357184f4118cf0c613c5384f12c17c6532d8c272f8c6789309e15c278e609e399298c67aa309e1a613cab85f1f40ae3592a8ca747184f97309ef9c278da85f1cc12c6b352184f56184fab309e5a613c2dc2789609e359278c6781309e26613cf5c27872c2780e08e3a913c6b35e184fb7309e85c2783a84f1cc16c6b34a18cf34613c0dc2782609e359248c678e309ee9c2781a85f14c16c69311c0930dcefd3d0afe9ea01a7c747fff7ef03dcb950f80af2a22061de738f868fe948e61c79b754de73254c1676e8de07a56443c8a736bc467c743778cd507fb14af1e386e15c23359184fa3309ee9c278e608e359248c6792309e06613cd384f1ac12c6335b184f87309e85c278ba85f1ac17c653278ce780309e9c309e7a613c4dc2781608e359278c6799309e16613cb5c2785a85f16485f1ac14c6334b184fbb309ef9c278ba84f1f408e3592a8ca75718cf6a613c35c278a60ae399298c679e309e15c2789608e3c90be3a916c6b35c18cf14613c3384f11484f1cc15c6d3298c67b1309e35c278aa22780e30f1c43d4fe18080d8763f0fbad82d0bef8fc7ef000f788cb47f0c18919778f24c3c71cfa0c80b886ddb4f7f4bd01a5c16dec7df7171e554de63a4fda89cc2fbd25633f1c43db763b580d8560b9abba47b00b2f03efe6e812ba7567b8cb41f95538dbc3ce1ff2dd1128cdc4add6b847d8ee31c32b5338ffd2fc16768443e8bbac5d30a9fa13a1ef7c9c78d07144f9995398ed9f2d0da05b1e2f7d978fcee6d348c51dfaf0c3ce1f8d81a8cdc4a8d8fc78087e3fb83a99de13876c26b536b84ee540773f504433ba3fa0eed9f8888dd1c24abc5c95168713282e7e4386b41f1ca653e904266093a5b9e55ae4cac59a8b74a0823f9f2bc3ce1f8b82a18b9951a1f4f020fc7f707533bc331e194d7a65511ba531dec5fa718da19d57768ff149c8772984fa49059751e1bb3e5a1396462cd42bd821046f21d63e529e4b3d066da4a8d63a78087639c67d23d1cc706bd36152274a73ad8bf0619da19d577687f10ce83322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb66b63cf4db4662cd42bd76218ce43bc9ca535c77680f466ea5d61d068187635d8649f770dde1b4d7a6f608dda90ee6ea69867646f51dda3f0de7419995599995599995599995599995599995599995599995599995599995599965335b1e7ae636b166a15e871046f29de2e5097fb7d5118cdc4aad3b9c061e8e7519a67686eb0eb7796dea88d09dea60aedec6d0cea8be43fbb7c1795066658e62b63cf46c2b62cd42bd4e218ce41b64e529ae9f760623b752e3d86dc0c331ce33e91e8e6367bc367546e84e753057cf30b433aaefd0fe19380fe5309f4821b3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abce95a3b3e5a1ff738d58b350af4b0823f94eb3f2b487eb0e5dc1c8add4bac319e0e1589761d23d5c7738ebb5a92b4277aa83fdeb2c433ba3fa0eed9f85f330d1994fa4905973637c98353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e39825e486e5e9766562cd42bd6e218ce4bb8d97277cee417730722b75dfce59e039c3a00f533bc3fb7686bc367547e84e75b07f0d31b433aaefd0fe109c076556e62866cbb3c69589350bf5d6086124df195e9e4216da4c5ba9716c087838c679a67686e3d8ed5e9bd644e84e7530576f67686754dfa1fddbe13ca48dd9f2f4b832b166a15e8f1046f2e1f7720f134fcee3c9456871be62dbfd5e57ae77af5978bf1718b9c6c31e8f91f631c79197787a99781a3c9e86082dce576cdbfe75ae3ccdbd66e1fd75c0c89553bd1e23ed47e55403f0ac63e269f4781a23b4385fb1ad16eb5d79ba7bcdc2fbeb81912ba7d6798cb41f95538dc0b39e89276e4c5a3f0eb1e3fad778c48ecb95f188ad9aabe6aab96acea979e63c6a9e398f9a675473519a335c4785f3bd14230006dcfaa08c7f2b705c7b32b5331ff5f7d87aaf4df8f718ce399cafbf37945999e39899e62d3ab25e6cd227f078681b62d6623ce74d7bbd36a561deb414f3891432abce6363b6b1ef483e7647d68b4dfa041e0f6d77306bc1d4ce703cb83388d698e2e5a00ee6e99d0cedcc405c3a36eddf09e7a11ce6132964569dc7c66c63df9578ece2f3e43136e913783cb4ddc5ac054f3b8be3c1dd41b4c6142f0775304fef66686706e2d2b169ff6e380fcaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccca2c9bd9c67e76e2b18bf3f7189bf4093c1eda9ecdac054f3b8bf3f7f704d11a53bc1cd4c1737e0f433b3310978e4dfbf7c0795066655666655666655666655666655666655666655666655666655666655666d9cc36f673928f1dfe1e0763933e81c743db7398b5606a67387f7f6f10ad31c5cb411d3ce7f732b4330371e9d8b47f2f9c076556e628661bfbb989c72eaee7616cd227f078687b2eb3163ced2c8e07f705d11a53bc1cd4c1737e1f433b3310978e4dfbf7c1792887f9440a995567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975ae1c9d6decfb138fdd1ecedf636cd227f07868bb9f590b9e7616e7ef1f08a235a67839a88379fa00433b3310978e4dfb14af12984fa4905973637c98353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e39825e4868dfdbce46387bf67c7d8a44fe0f1d0f63c662d98da19defff26010ad31c5cb411dccd30719da9981b8746cda7f10ce83322b7314b38dfd50f2b10b592f36e913783cb43dc4ac05533bc3f1e0e1205a638a97833a78ce1f66686706e2d2b169ff61380f6963c6f397492e7678df26c5a872afd6f77c57ae06df0b5cb9067c2f74e55af0bdc895ebc0f762579e04be9740dbc8f752575e09be97b9f27af0bddc95d781ef15aedc0bbe57ba720ff85ee5ca43e07bb52bdf0ebed7b8f21de07bad2bdf09bed7b9f25de07bbd2bdf0dbe37b8f2b3c1f74657be077c6f72e5e780efcdae7c2ff8dee2cacf05df5b5df93ef0bdcd95ef07dfdb5df901f0bdc3959782ef9108df3b5df979e07b972b3f08be77bbf201f0bdc795a780efbdae3c157c7f01657a7d9f2bd783ef5157ce81effdae3c0d7c1f70e506f07dd095a783ef43aedc08be0fbbf20cf07dc4956782efa3ae3c0b7c1f73e526f07ddc956783ef13ae3c077c9f74e5b9e0fb942bcf03dfa75d793ef83ee3ca0bc0f759575e08becfb9f222f07dde951783ef0baebc047c5f74653cbf7fe9ca0f818fc69587c147e3caf3c147e3ca0bc047e3ca0bc147e3ca8bc047e3ca8bc147e3ca4bc04779f752f051debd0c7c94772f071fe5dd2bc04779f74af051debd0a7c9477af061fe5dd6bc04779f75af051debd0e7c9477af071fe5dd1bc04779f746f051debd097c94776f061fe5dd5bc04779f756f051debd0d7c94776f071fe5dd3bc04779f708f828efde093ecabb7781afd995df0dbe0b5cf93de0bbd095df0bbe8b5c19c7998b5df97de0bbc4951f051f8d85ef07df335cf903e05be6ca1f04df7257fe10f856b8f287c1b7d2953f02be55aefc51f0b5b8f2c7c0d7eaca1f07df6a57fe04f8f2aefc49f0b5b9f2a7c05770e54f83afdd953f03be0e57fe2cf83a5df973e0eb72e5cf83afdb95bf00be35aefc45f0d1f7388d33b63fdb7e493a9046d6476d6e8d680bf926435bfa8264afe928161d9bf6db8191ce4161fc190ba3656cf3182d4f2783669857b495fa9ba913783a187898da19fecdd4e5b5a9dd6b530eea3c03dad9c5d0ce0cc4a563d37e17c4e638e7a8459d3bee324f8b1aa853ebbed0ecf769291de918367f0b116de9616e0b1d9bc6a59e7188ddedc5ce7bb1713ca6ad54ffea06e6350cccf6b8bdc91f37ec5f6bddb128a7284e1edab40e3448aa4d183be38ce290bf06caf39b86eb523dd283bebf88dde6329d4b64f73fd7e97d2e07757a22dadf1724dbfe5e8fa7d763b6d7f40d4dc31c0cfd21cc811e8f83f6f3a05d6f8c763da01dd5c1efbf1626edd6783cb4df023c748dd3053eba56207ebcce6a1d076e7fdceb8ae0265f3730b644301692670caf755a3c46da2f0023f9d6004f379366feb95ee6e983dfcb93bc3af4d91aa8b31abe1bb311756dbf5b9a196e17fd0dfec720d931bd8e412f9c1f08409fc0d3903662981c0ccf2124c93335189e23383b3478a6ff9681cb07fa8f6400adc6c3c4d74c4433aac087e5ea085f108c9c0ac129599a0ac129d92a4f169c82a1faf64f29db2c9a6e1838797ce899a7064e1d3e73f7e9a181237b076f41ea5a8f1e49e35a80a4e8a36d72303c69d31724bb1853e7c52a953c93e17512bc4f75f24f6f6b636a67f8a537c56b539dd7a61cd4a985f7a630b4330371e9d8b43f252276820351a8c5d4516831358267ea386b8113dfe4c39e4aefe3e24995d716ecd1d8263fcf136d10055c0ac7cf3838fb9eedecb5ae319382e1934da3a7bda2b527c1ce98da6f2d3b236a6740ed10646738ed8ca6fd52b333967686d2ce48da19483be3686718ed8ca29d41b433867686b03928ce00da193f3bc36767f42e01b6af02affdabda7e43da19393b036767dcec9595bd02b05723f6eadb5e29dad90f7b8560ffb2b4b30cf6dbd65ec9d86f69fbcd6aaf14ed15a2bda2b757b876956a83b18d4eeb4dc6361bdb626cabb16dc6b61bdb616ca7b15dc6761bdb636cafb17dc6f61bbbd4d865417176fd72635718bbd2d8338d5d65ec6a63d718bbd6d875c6ae377683b11b8ddd64ec6663078df51b3b64ecb0b123c6068c1d35768bb163c68e1b7b96b15b83e21d3a278d9d323668ecb4b1db8c9d31763628ae98d91532bb226657c0ec8a975de1b22b5a7605cbae58d9152abb226557a0ee0f8a2b4c76a5c8ae0cd95501bb0a6067fded2cff0b83e22cbe9db57f49509c95b7b3f076d6ddceb2db59753b8b6e67cded2cb99d15b7b3e076d6dbce72db596d3b8b6d67aded2cb59d95b6b3d076d6d9ce323f12146791edacb19d25b6b3c27616d8cefada59de4783e22cae9db5b5b3b47656d6cec2da59573bcb6a6755ed2caa9d35b5b3a47656d4ce82da594f3bcb696735ed2ca69db5b4b3947656f24bc61e33f657c6fedad8df18fb5b637f67ecef8d7dd9d8578cfd83b17f34f64f41312fffd9d8bf18fb9ab17f35f66fc6be6eecdf8d7dc3d8378dfd87b16f197bdcd8b78d7dc7d8778d7dcfd8f78dfdc0d80f8dfdc8d87f1afbb1b19f18fba9b19f19fbb9b15f18fba5b15f19fbb5b1278c3d69ec37c67e6bec77c67e6feca96078750307913fb81d9a69ef1f1a1a38797aa87968b0f9e4ed27868e9f3e7177f39dc7878e350fde3170e6e889c13bf1c3ef73c3162d236c3a73a6ffeee6e3a78e0cdcd53c78fb50f3e0d1e64383b79f3a72163ff465f7a185e746ec3f72243ed8b7aa9e06e977c718f497ee73b440b3ab74db9e188b204f8de54333abc7d6a04bddb70efdf57e45f16ab7f9ec89c1a1e67cf329f36fff09f3998123adcdf8de5923f2d9a1e6b343fd67869a8f9e193cd9dcd68ac7bd76ca181a51d334860fb5368dbee5c1ff03c304b133250a0400", + "bytecode": "0x1f8b08000000000000ffed9d77941cc5b5c67b3629cc8e562b6995c39264a55dcdcee6555ae52c106072d04a5a2119492ba4251963c08073ced938e300d838e28073ce09837304836d78ffbce377de3b87f3aa7aea7abf2d558f7786aed5ed9ddbe75c4df59d9abebffafa564d6f554feba9200852417eab54764670f246eff79ad7ec33db5a623c56d627672a219c1509e1ac4c0867554238ab13c2599310ce7109e11c9f10ce0931726ab68a60f81637ef440fbac6cd984e98a6b509d03493304d272540d3ba201963d4e48470d62784734a4238a72684735a42381b12c2393d219c3312c23933219cb312c2393b219c7312c23937219cf312c2393f219c0b12c2d99810ced312c2797a4238cf4808e79909e13c2b46cea5c0b9d0bc3ecbbc2e32af8bcdeb12f34a9f59665e9b4c1babcc7eb3b2e59a4d598bf55e4e59abb23665edd67b1dca3a957529eb36ef359af77a94ad50b652d92a65ab95ad313aac55b64ed97a651b946d54b649d966655b946d55b64dd976653b94ed54b64bd9d9cace51b65bd9b9cace5376beb2672bbb40d985ca2e5276b1c57289b24b955da6ec72655728bb52d91e657dcaf62adba76cbfb27e6507945da5eca0b243ca9ea3ec6a6587951d517654d980b263caae51765cd9096583caae55769db2eb95dda0ec464bb3e72abb49d9f394dd6c713e5fd92dca6e55769bb21728bb5dd91dcaee54f642652f52f662652f51f652652f53f67265af50f64a65af52f66a65af51f65a65af53f67a656f50f646656f52f666656f51f656656f53f67665ef302cd411dea9ec5dcaee52f66e65ef51f65e65ef53f67e651f50f64165772bfb90b20f2bfb88b28f2abb47d9bdcaee53f631651f5776bfb24f28fba4b24f29fbb4b2cf28fbacb207947d4ed9e7957d41d917953da8ec4bcabeacec2bcabeaaec6bcabeaeec1bcabea9ec5bcabeadec3bcabeabec7bcabeafec0796e63f54f623653f56f613e3fba979fd99a94bf3623f57f60b537ec8bcfed2bc3e6c5e1fb13ef32b65bfb67cbf51f65bcbf73b65bf37e53f98d73f9ad73f99d73f9bd7bf98d7bf9ad747cdeb63e6f56fe6f571f3fa8479fdbb79fd8779fda7797dd2bc3ea5ec9c867c797c30b4f506318d516d07b27a4d85c45f180cdfb41695e63d7a6d34fe2ab34fafa45db5d9afb6fc3566bfc63ace78b33fdef2d79bfd7acb3fd5ec4fb5fc0d66bfc1f2cf30fb332cff9966ff4cf0a7039873357eedab34ae14f8285f2bc0576d7c95e0aba1c3816f9cf155838fce6f0df82618df38f04d34bef1e04b1bdf04d25259adf1f50671e54ab64f1f3713f771cd3ad4a4f879f7e9e3d679e29d1c3f6fbf3e6ebd075e9d1f53ccb12643de4c35be7af04d33be29e03343d0bffb9cf64d37be69e09b617c0de09b697cd3c137cbf866806fb6f1cd04df1ce39b05beb9c6371b7cf38c6f0ef8e61bdf5cf02d30be79e06b34bef9e03bcdf81680ef74e36b041fdde3721af8ce34bed3c17796f19d013e1a6bcf041f5d1b9e657c7a9c189f82cf183f8d51e167687c06df221a9bc1b798c665f02da131197c4b2136f996c1b842be26e3a3314abfd763cabd415c7d2217f68915711f571d591f7755fcc70dd7ed560743baf6429c15a0d51a538ef1dea0168c9d324671c85f05e5ad5097ea911ef43d43ecfafb64a529af29f0b91eeb7319a8b3d2d1fede20def6afb2785659ccd5d07e3f39db9a939c1df15674ce5e0875eddca36b9eb198b33b80c343ce7648ce8e782b3a67fba1ae9d7b74dd3b1673f612e0f090b37d7e723697959ccdcf9105813bf7e86f9fb198b3078123fe9c6d979c1df95674cede0675eddca3bf7fc762ce5e071cf1e76c679f5c1b8c782b3a675f0575eddca3b998b198b3770087879ced977176c45bd139fb0ea86be71ecd0b8ec59c7d2d70c49fb3dd9e72b6557236c8af7706813bf7688e7a2ce6ec5dc0117fceee93f9d9916f45e7ec0350d7ce3d5a2f198b397baf29eb75869f9a7586b9e0fb99f1cd03def8737b7f9ba7dcce496ee7ef030902778ed2dadd58cced074d59e7f14370ef01f97e697ca781ef61e33b1d7c8f18df19d02e0f7da04ffac088b7a2fbc0afa1ae9dcbb48e3c16fbc08f81c343ceee939c1df15674ce3e0e75eddca37b1ac662cefe0e383ce46cbfe4ec88b7a273f65f50d7cebd45a63c167396ee2bd5d70b7f30d70b4bc0f747e35b0abe3f19df32f0fdd9f89ac0f717e36b06df5f8d6f39f81e35be2cf81e33be16f0fdcdf872e07bdcf85ac1f784f1b581efefc6d70ebe7f185f07f8fe697c9de07bd2f8bac0f794f1751b9f5eefa27bafbe6b7cfadc9246bd41bce796eeb1a463d3feb251885d67c5ae1bc5d8f556ec7a47ec260fb1d31083b694b5df0be526bf3cd94c30fcf71f146b79fcb15a75db9b8391b77d39f0643db43d0d3146c293059e96f879c27b7d73f11f373cc7cd96a66988d50ced6af5d0ae14c4a263d33ec5cb800fc7ef5607635bfc8cb914c4a263d37e1b30920fbf4fe87b9dfa8ffe3e5c981ae2f5d097c26b228cd70b1c14af0aea3c396da8ee12c3560befe3776b8be5f39497615e502c3a36ed53bc5a684fcbe833e646ca98b5187d8d11298845c7b663637f6f1a7dcd46745e33e03b056352aed431a916d846e33a25ea5c7389ede3fb2a0531686c23cd295e15d4995e395477338cbb1efa5faed8eb371c0fe2cfe35c16fbf548785a81c747dff7d45fb3f8bdff74106faeb55b5ab5585a65a04e1be8d7ee41bf42d721144f98855998855998855998855998855998855998855998855998855998855998f933e3fd17b8be49f5963161245f0e787cccf387cf8f32c7a2e3eb759d87615d27fe758b5c16d72ce91ec3c5569baba0ce13a921b6dfc07ababd36886b9acbfc6a37a2fb2c6a8393d7627dae2146ad03bbd62f1b638b9ddbe76bbd4d3f43453f87acd9d2759943530ff7a90cd33465698af7292eb578749eceaa1c62f3b1f657ec5a246a45e538d7f6f01e03bfe7253f7e502e5404c3c70ffc9ee9883df6f0354c5a2fefb06257419dff490d9d9b2e78bf3738f99e275da7d33a367d66317cb6d33a769df92c71d458c76f86cf529dff8331f59d15c1bf35f371ff078ecb01b415b75e28e3ba79fcdfc3f975fcd62278da81c7c738e3e97a238b7d20ee75fc4e4b2bd7750cd5e900fd3a3de8e7ba16a57d8a27ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccfc99f1b7a2c49a867a39268ca374ef43b89e41cf7fc1b5a997570cc5f5bd0e476b4e4bac3657419d1f540cb1bdda946b8393ef77883a971ed6f30a9e4b8a570bedc1b5205fbfe76eb378da1c5a50b931b6d8f975fcf8351e5ac76fb574cd3934f5d55f718d1535c5feda62f1e0da686d70f2bd256938ce68dc3b149517140ffb521bf8a88cbf8ff6719ef1bbc4beaf87e2e1faf5dd46dbbac0d7b9cf657d8e1bb4364f6bf5ad8eb6529d7b60ecbbcf94f11e0ebc77e441c7fbb4155aa726fdbc3ccb2e9b5ff7a567c0d1f9ed71c45e09ac31c56ec1d829631487fc5550fe62c5505daa477a90d6c4aefb083d130cd9edcfb5589fcb409d6e47fb7b8378dbdf63f1f458cc3a77ee873c7b10beff7d8d49dd111a2d068da80e5e07f9ba27cf1e23edfb1bf1bebd71561dbc66a13adf84312aeafe51d73d87bebec7a2ee39745d1bb703a3dd46fb3ecf72bf4feb21182fe2be4feb21c821bc4f2bb08ebf048e4f5ce382e8ef16aaf32bebf8f635397d06ef03a33abf85f1a2cedcb3581b9c7cfd8df74c8dc6df5751f749533cbcaec1befd9fdaae99bba07e6f8ccc9813c882f944751eb3ce596704f772c7679f88f82c69d564caf8f78bad9fd6a11b3ed31b8b0ef93edf63b585f2ba1bda4275fecbba068cffba257f0d187f5b875f93d038d0e6682bd5f96fe86bff826b3c3a4f385ed5549efc3e6d85ae01493fdde6d17e3e30c6e6f07ce0eacaa1baf6737e49eb629f0fdc617d8ee3f381ff17f2ac06ee43f73556af8cd06809684475f0b741f43d82cff2757dc7f8bab73fea3bc6f50c4a1cdbeb2a479fcd9e57735d23501dfa2c5e234c33cc754667bbae3d5f48df9771de378cbf956886b8f85b89664f7a6641b75ed8c7eb8253193beb2976d433a7b3a3103bea99d3a311bbde8a5d3f8ab14573d19c93e61e9e891cfefe0c9f59aab742d7a5c49081cf552480b132018c550960ac4e00634d0218c72580717c021827248071620218d3c0782abfdb3de8932b551f5fe7abd0b506c66ef2a44531ff7f87e7ff4ba5e0b50fc6f6f0375da8455330722df0ef3c1fcf7e28f6ff7a2106fcbf0ba62480716a0218a72580b121018cd313c03823018c3313c0382b018cb313c03827018c7313c0382f018cf313c0b820018c8d09603c2d018ca72780f18c04309e9900c6b312c0b8501863615cea9731572aa3e6f1f17ffe3d93ff73cc034fd675cfa9a7df9e14fdffad797e3e694ba9cf8dc37b4bfcfe9f70cfecd9763eee1d29f6d97685febf554f8cb952197dddc78ebfe319090ffe2ed2f5db1a0f8cb952197dfdfe057fa337129e0ed0acdda19907c65ca98cbeee952bf65e4ebca7bfc3a19907c65ca98c785f758c3ca1669d45f07481669d0ecd3c30e64a65f4755f721a628c84a71b34eb7268e68131572aa3a7dfb6859a7517c183bf01eb7668e68131572aa3e659e149b39e22785680663d0ecd3831224fdccfc9ee71c4f2f19bc162db4e0cc83821018c1313c088f749f818bf0add27d1e3579f5ca9faf83a5f85ee93c0d81e7e1f136a81bf87f84f5aacf2cb53f03e098cbdda9316f87b95ffa4c56ae0f1f1fb9934c418090f3164e0735312c03835018cd312c0d89000c6e909609c9100c69909609c9500c6d909609c9300c6b909609c9700c6f909605c900046fc5bd5c3b562c1bf5f568ff1d8517fab8cf5d8517f978cf5d892e792e7e5105bf25cf2bc1c624b9e4b9e97436cc973c9f372882d792e795e0eb125cf25cfcb21b6e4b9e439a7d84998e317c6b1c7883c8df1f164b1ed18ab9741db7b1d3c294f6dc7586b19b49d1892c6b826018c2b12c0283ae6ef412c8551f3acf3c4b3b6089e75c0b3de13cfba2278d603cf86f879c29c5a5f040f3164e0732b12c0b826018ca2a3e8c88951742c1f1d8551188551184f056312c670614c443ee64a65d43c1be3e70935db5004cf46d08c3ed7e29731572aa3e6d9143f4fa8d9c622783681661b1d9a7960cc95caa87936c7cf136ab6a9089ecda0d92687661e1873a5326a9e2df1f3849a6d2e82670b68b6d9a19907c65ca98c9a676bfc3ca1665b8ae0d90a9a6d7168e68131572aa3e6d9163f4fa8d9d62278b681665b1d9a7960cc95caa879b6c7cf136ab6ad089eeda0d93687661e1873a5326a9e1df1f3849a6d2f82670768b6dda19907c65ca98c9a6767fc3ca1663b8ae0d9099aed7068c69571450218d72480d1b38eb9521935cf2e4f3c3b8be0d9053c677be2d95504cfd9c0734efc3c614e9d5d040f3164e0732b12c0b826018ca2a3e8c88951742c1f1d85511885b138c6de0430cab91646ae8c1efebe2af81b9ab3c778ec3a2b765d99c48efa0dcd588f2d792e795e0eb125cf25cfcb21b6e4b9e47939c4963c973c2f87d892e792e7e5105bf25cf2bc1c624b9e4b9e97436cc973c9f372882d792e795e0eb125cf25cfcb21b6e4b9e47939c4963c973c2f87d892e792e7e5105bf25cf2bc1c624b9e4b9e97436cc973c9f372882d792e795e0eb125cf25cfcb21b6e4b9e47939c4963c973c2f87d892e792e7e5105bf25cf2bc1c624b9e4b9e738abd3bfed8b9629f31b31b787c3cf3c6533bb3fab8e79a633d1da37e5aabf32cadceb6b4ca409d7341bff33ce89782b8746cdaa778c5323f8b01b3a7d8b949ea1813a0fd14638da5878e7fbea7b6478df5e78ff1d85163fd588f1d35d68ff5d892e792e7e5105bf25cf2bc1c624b9e4b9e73898de5ea60e8ba9d9e7faa8ff16c783f65b1eaad0aea9c332eff5a17481ff2115bfa907c5794436cc973c9f372882d792e795e0eb125cf25cfcb21b6e4b9e47939c4963c973c2f87d892e792e7e5105bf29c5f9e633e548c024f60f10405785633e3d9c68c6733339e2e663cf399f1b433e399c98c27c78c670a339e0dcc782630e359cc8ca79219cf5a663c59663c3b98f12c60c6b38419cf2c663c5399f14c64c653c58c671d339ee5cc787632e3d9ce8ca78719cf42663cddcc783632e3e960c6339b194f2b339e69cc789632e34933e36966c653cd8c670b339e26663c8b98f1ec62c6b39219cf1c663c0dcc786a99f16498f1d430e359c58c672b339e4dcc783a99f1cc65c6d3c68c673a339e65cc782631e3a963c6b39e19cf38663cf398f1cc60c63399194f3d339ef1cc7846e37943c5f0a418f0a483939f499686f77783afc2faac1eaf5a1a86debfc0f82be033179a72a5e3d817808f7e1b7ea1e3b3a8d305d0965e53ce3eb32dd40963f5c23ec5ab058e0b99f0ec66c6339e194f3d339ec9cc786630e399c78c671c339ef5cc78ea98f14c62c6b38c19cf74663c6dcc78e632e3e964c6b38919cf56663cab98f1d430e3c930e3a965c6d3c08c670e339e95cc787631e359c48ca78919cf16663cd5cc789a99f1a499f12c65c6338d194f2b339ed9cc783a98f16c64c6d3cd8c6721339e1e663cdb99f1ec64c6b39c19cf3a663c55cc782632e399ca8c6716339e25cc781630e3d9c18c27cb8c672d339e4a663c8b99f14c60c6b38119cf14663c39663c3399f1b433e399cf8ca78b19cf66663cdb98f1ac66c653e1e0f1f0ff5f863c74ff1a1d9bf6773389ede13c84ffefe7459eda74b139568d392ef153bc2aa87389b930d0f7a3e06789cbbedf10ef9dbb1834bad8535be87ca4acf3e339760eefab0c8021b0f4091c3c3eee47f5d4ce617918e3ff3f9bd55a5d6269659fbb0cd4b908f4bbc4837eaedcfe771f30af4964d63cf4dd41ac69a8b79a0923f9cef7cb13f6dbd5c1f0ad50bfbd04787c8c619eda19f6af4bad36ad76e84e7530572ff5d04e57dfa1fd4be13c248d59f3ac3565624d43bdb54c18c977b15f9eb07fad0d866f85fad7a5c0e363fcf1d4ceb07f5d66b569ad4377aa83b97a998776bafa0eed5f06e72169cc9a679d29136b1aeaad63c248be4bfcf2b4a5a1cdb415ea5f97018f8ff1c7533bc3fe75b9d5a6750edda90ee6eae51edae9ea3bb47f399c0761166617b3e6a1df98106b1aeaad67c248be4bbdf2b465d3d066da0a8d6397038f8f71de93eee1387685d5a6f50edda90ee6ea151edae9ea3bb47f8523766310af16578e408b2b1d3c578eb21614af58e68b12c82c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e8ac37d15974169d45e738984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da39839e8ac79e81931c49a867a1b983092ef32bf3ce1ef823604c3b794b5df0be52b81e7720ffa786a67780ff91eab4d1b1cba531dec5f7b3cb4d3d577687f0f9c873d45305f914066d1b93466cd43cf8a25d634d4dbc884917c97fbe509c7b18dc1f0add038b607787c8cf39eda198e637d569b363a74a73ad8bffa3cb4d3d577689fe209b33047316b1efa3f6c88350df536316124df955e7972e1ef1b3705c3b742e3581ff0ec899d273f8e79d03d1cc7f65a6ddae4d09dea60aeeef5d04e57dfa1fdbd701e8a61be2281cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a978fce9a87feef10624d43bdcd4c18c9b7c72b4f6bb8eeb03918bea5acfd5e28ef059ebed879f2eb0e1e740fd71df6596ddaecd09dea60ffdae7a19daebe43fbfbe03c8c75e62b12c82cb9313acc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc1c7243f36c3165624d43bd2d4c18c9d7e797277ceec19660f856e8be9d7dc0b3d7833e9eda19deb7b3df6ad31687ee5407fbd77e0fed74f51ddadf0fe7419885d9c5ac79b69a32b1a6a1de56268ce4dbeb97271cc7b606c3b742e3d87ee0f131ce7b6a67388ef55b6ddaead09dea60aef67b68a7abefd07e3f9c0761166617b3e6d966cac49a867adb9830926f9f5f9e701cdb160cdf0a8d63fdc0e3639cf7d4ce701c3b60b5699b4377aa83b97ac0433b5d7d87f60fc07910666176316b9eeda64cac69a8b79d0923f9f6fbe5c9a5a1cdb4151ac70e008f8f71de533bc371ec2aab4ddb1dba531dccd5ab3cb4d3d57768ff2a380f4963d63c3b4c9958d3506f071346f2f5fbe509fbd78e60f856a87f5d053c3ec61f4fed0cfbd741ab4d3b1cba531dccd5831edae9ea3bb47f10ce43d29835cf4e5326d634d4dbc984917c07fcf284fd6b67307c2bd4bf0e028f8ff1c7533bc3fe75c86ad34e87ee540773f5908776bafa0eed1f82f3903466cdb3cb9489350df5763161241f7e5fecf2c493b178320e2dc662ec3a2b765d99c4aeb762d797496cc973c9f372882d792e795e0eb125cf25cfcb2176b9e69a685e9e9aa74ea1e6a953a8794a3467a9f9d3f1c56ec771a502621df4d44edc7aa18cf373b47531e399cf8ca79d19cf4c663c39663c5398f14c60c6b398194f25339e2c339e05cc789630e399c58c672a339e89cc78aa98f12c67c6d3c38c6721339e6e663c1dcc786633e36965c6338d19cf52663c69663ccdcc78aa99f13431e359c48c6725339e39cc781a98f1d432e3c930e3d9cd8ca78619cf2a663c9dcc78e632e36963c6339d19cf32663c9398f1d431e319c78c671e339e19cc782633e3a967c6339e194f8a014f3a38f9f728f87b824af0d1fdfdbbc0f71c53de0dbe0a470c3ace21f0d1fc291d438f372b1b4e66a880cf5cede07a8e231ec5b9daf1d9d1d01d63f5c23ec5ab058eab99f08c67c653cf8c6732339e19cc78e631e319c78ca78e19cf24663ccb98f14c67c6d3c68c672e339e4e663cab98f1d430e3d9cd8c27c38ca796194f03339e39cc785632e359c48ca789194f35339e66663c69663c4b99f14c63c6d3ca8c6736339e0e663cddcc781632e3e961c6b39c194f15339e89cc78a632e399c58c6709339e05cc78b2cc782a99f12c66c6338119cf14663c39663c3399f1b433e399cf8ca78b194f858367b7279ea8e729ec66105bef674117bda5e1fdd1f81de06e8b91f60f0223f2124fd6134fd43328b20c62ebf6d3df12b4069786f7f1775cbe722a6b31d2be2ba7f0beb4e59e78a29edbb19c416cad05cd5dd23d0069781f7fb7e02ba7965b8cb4efcaa97abf3ce1ff2dd1140cdf0add6b847dcec739f4d4ce2cf6bf189fa1e17c167593a5153e437534ee938f1a0f289e300b7314b3e6a1b50b62c5efb3d1f8dddb48185ddfaf1e78c2f1b13918be151a1f0f028f8fef0f4fed0cc7b1c3569b9a1dba531dccd5c31edae9ea3bb47fd811bb3188578b2323d0e28883e7c8286b41f18a65de9d40660e3a6b9e65a64cac69a8b78c0923f9b27e79c2f17159307c2b343e1e011e1fdf1f9eda198e0947ad362d73e84e75b07f1df5d04e57dfa1fda3701e8a613e9c4066d1b93466cd4373c8c49a867a39268ce43be89527974d439b692b348e1d051e1fe3bc27ddc3716cc06a53cea13bd5c1fe35e0a19daebe43fb03701e845998855998855998855998855998855998855998855998855998855998859937b3e6a1df36126b1aeab5326124df11af3cf97587d660f85668dd6100787caccb78d23d5c773866b5a9d5a13bd5c15c3de6a19daebe43fbc7e03c08b3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300b336f66cd43cfdc26d634d46b63c248bea37e79c2df6db505c3b742eb0ec780c7c7ba8ca77686eb0ed7586d6a73e84e753057aff1d04e57dfa1fd6be03c08b330bb98350f3ddb8a58d350af9d0923f906bcf2e4d74fdb83e15ba171ec1ae0f131ce7bd23d1cc78e5b6d6a77e84e7530578f7b68a7abefd0fe71380fc5301f4e20b3e82c3a47318bcea27314b3e82c3a47318bcea27314b3e82c3a47318bcea27314b3e82c3a47318bcea27314b3e82c3a47318bcee5a3b3e6a1ff738d58d350af830923f98e79e5690dd71d3a82e15ba17587e3c0e3635dc693eee1bac309ab4d1d0edda90ef6af131edae9ea3bb47f02cec358673e9c4066c98dd16196dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e62e6901b9aa7d39489350df53a993092ef1abf3ce1730f3a83e15ba1fb764e00cf710ffa786a6778dfcea0d5a64e87ee5407fbd7a08776bafa0eed0fc27910666176316b9e2e5326d634d4eb62c248bee37e79726968336d85c6b141e0f131ce7b6a67388e5d6bb5a9cba13bd5c15cbdd6433b5d7d87f6af85f3903466cdd36dcac49a867add4c18c987dfcbdd9e7832164fc6a1c5a98aadf77b4cb9d6bca6e1fd1e60f4351e765b8cb48f398ebcc4d3e389a7cee2a9736871aa62ebf6af34e549e6350defaf04465f39d56331d2be2ba7ea8067a5279e7a8ba7dea1c5a98aadb55865ca93cd6b1ade5f058cbe726aa5c548fbae9caa079e559e78a2c6a455a3103baa7f8d46eca85c198dd8a2b9682e9a8be63e354f9d42cd53a750f39468ce4a730fd751e17c2fc5088001b75e28e3df0a3eae3d3db533ebfa7b6c95d526fc7b0ce71c4ed5df1bc22ccc51cc9ee62ddad2566cd227b078681bf4acc568ce9bf6586d4ac2bc6921e6c30964169d4b63d6b1af8b3f765bda8a4dfa04160f6dd779d6c2533bc3f1e0fac0ad31c5cb401dccd3eb3db4330571e9d8b47f3d9c8762980f279059742e8d59c7be21f6d8f9e7c9636cd227b07868bbc1b3167eda991f0f6e0cdc1a53bc0cd4c13cbdd1433b5310978e4dfb37c2791066611666611666611666611666611666611666611666611666611666611666decc3af673638f9d9fbfc7d8a44f60f1d0f65ccf5af869677efefea6c0ad31c5cb401d3ce7377968670ae2d2b169ff26380fc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2cc9b59c77e5efcb1c3dfe3606cd227b078687b9e672d3cb5339cbfbf39706b4cf1325007cff9cd1eda9982b8746cdabf19ce83300bb38b59c77e7eecb1f3eb79189bf4092c1eda9eef590b3fedcc8f07b7046e8d295e06eae039bfc5433b5310978e4dfbb7c0792886f97002994567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a59742e1f9d75ec5b638fdd1acedf636cd227b07868bbd5b3167eda999fbfbf2d706b4cf1325007f3f4360fed4c415c3a36ed53bc72603e9c4066c98dd16196dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e62e6901b3af60be28f1dfe9e1d63933e81c543db0b3c6be1a99de1fd2fb7076e8d295e06ea609edeeea19d29884bc7a6fddbe13c08b330bb9875ec3be28f9d4b5bb1499fc0e2a1ed0ecf5a786a67381edc19b835a67819a883e7fc4e0fed4c415c3a36eddf09e72169cc78fe52f1c50eefdba41815e655fb5e68ca95e07b91295781efc5a65c0dbe9798720df85e6acae3c0f732681bf95e6eca4bc1f70a535e05be579af24af0bdca947bc0f76a53ee06df6b4c79107caf35e56bc1f73a53be0e7caf37e5ebc1f70653be017c6f34e51bc1f726537e2ef8de6cca3781ef2da6fc3cf0bdd5946f06dfdb4cf9f9e07bbb29df02be7798f2ade07ba729df06be7799f242f0dde5f0bddb945f00bef798f2ede07baf29ef06dffb4c7902f8de6fca13c1f70128d3eb074db9167c779b72067c1f32e549e0fbb029d781ef23a63c197c1f35e57af0dd63ca53c077af294f05df7da63c0d7c1f33e506f07ddc94a783ef7e539e01be4f98f24cf07dd2946781ef53a63c1b7c9f36e539e0fb8c29cf05df674d791ef81e30e5f9e0fb9c292f00dfe74d19cfef174cf90ef0d1b87227f8685c7921f8685c7911f8685c7931f8685c7909f8685c7929f8685c7919f828ef5e0e3ecabb57808ff2ee95e0a3bc7b15f828ef5e0d3ecabbd7808ff2eeb5e0a3bc7b1df828ef5e0f3ecabb37808ff2ee8de0a3bc7b13f828efde0c3ecabbb7808ff2eeade0a3bc7b1bf828efde0e3ecabb77808ff2ee9de0a3bc7b17f828efee021fe5ddbbc14779f71ef0359af27bc1779a29bf0f7ca79bf2fbc1778629e33873a6297f107c6799f2dde0a3b1f043e07b96297f187c8b4cf923e05b6cca1f05df1253be077c4b4df95ef02d33e5fbc0d764ca1f035fb3297f1c7ccb4df97ef0654df913e06b31e54f822f67ca9f025fab297f1a7c6da6fc19f0b59bf267c1d761ca0f80afd3943f07be2e53fe3cf8e87b9cc619dd9f75bf241d4823eda336373bda42bef1d096de20de6b3a8a45c7a6fd5660a473901b7dc6dc48195b2c46cdd3ee4133cc2bda0afdcdd40e3c6d1e783cb533fc9ba9c36a53abd5a60cd47916b4b3c3433b5310978e4dfb1d10dbc739472d6acc7117595a54419d6af385a6bf4f0be948c7d0f99b73b4a5db735be8d8342e758f42ec4e2b76d68a8de3316d85fa572730777960d6c7ed89ffb861ff5a618e45394571b2d0a695a0415c6dc2d829631487fc55509edd305497ea911ef4fd45ec3a97e95c22bbfdb976eb7319a8d3ed687f6f106ffb7b2c9e1e8b595fd3d7350c7178e80f610e745b1cb49f05ed7a22b4eb06eda80e7eff3579d2aecbe2a1fd26e0a16b9c0ef0d1b502f1e37556f32870dbe35e87839b7c9dc0d8e460ccc5cf185eeb34598cb49f0346f275014fa727cdec73bdc8d207bf97c75975e8b3555067397c37a61d7575bf5b981a6a17fd0dfe7410ef985ee3412f9c1f08409fc0d2903662181f0ccd21c4c93331189a2338313870bcefaafe73fbfbf6a700adcac2c4d794a31915e0c372a5c31704c3a742704a96a642704ab6c29205a760a8befe534a378ba61bfa8f1c1a7cf6d1fea3fb8edf786cb07fff8e81ab90badaa247d2a8162029fa681b1f0c4ddaf406f12ec6d458b10a25cf78781d07ef539dec33db5a3cb533fcd29b60b5a9c66a5306ea54c37b133cb4330571e9d8b43fc1113bc68128d462e208b498e8e09938ca5ae0c437f9b0a7d2fbb8785261b5057b34b6c9cef3581b440117c2f153064ebfa73b7bb569ccb860e864d3e8a9af68f549d033a6fa5b4bcf88ea19503d04e9194e3da3a9bfd4f48ca59ea1d433927a0652cf38ea19463da3a86710f58ca19e216c0cf233807ac64fcff0e919bdb380edbbc0abffaad6df907a464ecfc0e919377d65a5af00f4d588befad6578a7af6435f21e8bf2cf52c83feb6d55732fa5b5a7fb3ea2b457d85a8afe8f515ae5ea55aad6c8dd17aadb275cad62bdba06ca3b24dca362bdba26cabb26dcab62bdba16ca7b25dcace56764e909f5d3f57d979cace57f66c651728bb50d945ca2e567689b24b955da6ec72655728bb52d91e657dcaf62adba76cbfb27e6507945da5eca0b243ca9ea3ecea207f87ce116547950d283ba6ec1a65c7959d08f22b667a854caf88e91530bde2a557b8f48a965ec1d22b567a854aaf48e915a85b83fc0a935e29d22b437a5540af02e8597f3dcbffe2203f8baf67ed5f16e467e5f52cbc9e75d7b3ec7a565dcfa2eb59733d4bae67c5f52cb89ef5d6b3dc7a565bcf62eb596b3d4bad67a5f52cb49e75d6b3cc7705f959643d6bac6789f5acb09e05d6b3be7a96f7ee203f8bab676df52cad9e95d5b3b07ad655cfb2ea59553d8baa674df52ca99e15d5b3a07ad653cf72ea594d3d8ba9672df52ca59e95fca2b207957d49d997957d45d957957d4dd9d7957d43d937957d4bd9b7957d27c8e7e5f7947d5fd90f94fd50d98f94fd58d94f94fd54d9cf94fd5cd92f943da4ec97ca1e56f688b25f29fbb5b2df28fbadb2df29fbbdb23f28fba3b23f29fbb3b2bf28fbabb247953da6ec6fca1e57f684b2bf2bfb87b27f2a7b52d953c1d0ea060e22ff323b34d3de3738d87fe4d860e3e040e3916b0f0f1e3a76f8c6c6eb0f0d1e6c1cb8aefff881c303d7e3873f68862d5a46587bfc78df8d8d878eeeefbfa171e0dac1c681038d7b07ae3dbaff047ee81be643734f8ed8b77f7f74b05f543c03d2474a0cfaa8f91c2dd06c2ddcb6c74b11e4a9523e34b5b2b4069d6dbe75e8aff7f3f257bb8d270e0f0c36661b8faa7ffb0eabcff4ef6f6ec4f74e28914f0c369e18ec3b3ed878e0f8c091c696663ceec5134a68445543091f6a6e1879cb83ff072748e4d5250a0400", "isInternal": false } ], - "packedBytecode": "0x000000028df71de500000047cf1f8b08000000000000ffed9d779c1545baf77b6008726644cc6b1c4ca8280e87cc0c3098136614111186610405862866d435908339820425670105258961734e6ed275dd74efddddcffbc77def7d83efdb754e3d3bbf29ab0f73c6aec3efcca9fe7c6a4ef533d5fd7cebd74f57a7eaae7f06415014a4a796613a23f8ea24ffafd2bfe55f6fea1ae3baca5d7216e509678b3ce16c99279cc579c2d92a4f385be709679b3ce16c9b279c87c5c8a9d85a040da7b879db39d0356ec6449e695a92079a96e699a687e781a6ed83fc68a38ec813ce0e79c279649e701e95279c47e709e73179c2796c9e701e97279cc7e709e737f284f3843ce13c314f384fca13ce93f384f3943ce13c354f38cbf284b3639e709e96279ca7e709e71979c279669e709e15236767e0eca47fcfd6bfe7e8df73f5af943d4fff9eaf7fbbe83a16ebf90b145798d4439aa4f1bf6e61ea1ea61e61ea69fcaf57987a87a94f98faeaff95e9ff5584a9324cfdc2d43f4c03b40603c37461982e0ad3c561ba244c9786e9b2305d1ea62bc2746598ae0ad3d5611a14a66bc2746d98ae0bd3f561ba214c3786e9a6300d0ed3cd61ba254c43c2746b98861a2cb7856958986e0fd3f030dd11a611611a19a6ea308d0a534d984687a9364c7786694c98c686e9ae30dd1da671611a1fa60961aa0bd3c4304d0ad3e4304d09d3d4304d0bd33d619a1ea67bc3745f98ee37347b204c0f86e9a1303d6c70ce08d323617a344c8f85e99b617a3c4c4f84e9c9303d15a699619a15a6d9619a13a6b9619a17a6f9615a10a685615a14a6a7c3f44c989e0dd373617a3e4c2f84e9c530bd14a697c3f44a985e0dd36b615aac5964475812a6d7c3b4344ccbc2b43c4c2bc2f44698de0cd3ca30ad0ad3ea30ad09d3da30ad0bd3fa306d08d3c6306d0ad3e6306d09d3d630bd15a66d61da1ea61d617a3b4cef846967987685e9dd30bd17a6dd61da13a6bd61da17a6fd617a3f4c07c2f441983e0cd34761fa384cdf0ad3b7c3f49d307d374cdf0bd3f70dcd7f10a61f86e94761fab1b6fd44fffe549795fb773f0bd3cf75fe17faf797faf757faf71363995f87e93786edb761fa9d61fb7d983ed5f9cff4ef1ff4efe7faf78ffaf70bfdfb27fdfb67fdfb17fdfb57fdfb37fdfb6ffaf7dff5ef7fe8dfbfebdf7fe8df7f86696bc774be6d503f550531b551dd6b53cf7e44fc4e41c34969d152ff4f7ecbb4bd58cfcbaf68d74acfb732ecadf57c6b633d6df57c5bc3de41cf7730ec47e9f9a30cfb317afe18c37e9c9e3fceb09fa1e7cf007b22807bc3daae6c2db5a9086c12af2dc0d64adb5a82adb5ac0e6c6db4ad15d864fbb606db61dad6066cedb4ad2dd812da76986819a6126dab0ae28a95f2916abda571af573f2f3b3c7ede516abded1df11e113fef68b5de0e0e78557c1ca9d77504c4cd51dad6016c476bdb91603b46db8e02dbb1da7634d88ed3b663c076bcb61d0bb66f68db71603b41db8e07db89daf60db09da46d2780ed646d3b116ca768db49603b55db4e065b99b69d0236dde406a782ed346d2b03dbe9dad6116c6768db69603b53db4e07db59da7606d8a4fd3d136c72be7896b6a9b6e3b0225846dba5dd4a2d236d36d8ce91f61a6ce74a5b0db6ced24e83ed3cf02db6f3a1ad115b176d93764bfdafafce570571ed27c95ab5de8ab8d71bae59adb75ffceb4d3d73ec1fd4eb5a057e2a40ab013a1f63bfa6aee8bb4827f123f662c85f0965a59ce821c71e6157c7984a9d1f9061b9bec672a550a6d252ffaa20defaf73378fa19ccad20ef2666bb75f331dbe829eb981d0265cdd893f3a0e618b38380c341ccf6f231dbe829eb98ad85b266ecc9b970738cd9db80c341cc56bb89d964b98fd9f47db320b0c79e5c0f35c7981d0b1cf1c76c0f1fb38d9fb28ed9c7a0ac197b724ddc1c63763a70c41fb3bdaafdb941a3a7ac6376219435634feecf34c7987d02381cc46cad6f671b3d651db38ba1ac197b72afb039c6ec33c0117fccf67114b3dd7ccc06e967a041608f3db96fdd1c63762970c41fb3a3fcfdd9c64f59c7ec4e286bc69e3c43698e31bb51e7d573869fe8e70c2781eda7da7632f0c61fdb353d1cc576d2c776ba6f4810d863549ee735c7d8dea3f32a8e7f01fd11c4f64b6deb08b65f69db6960fb44db4e877a39d807aafd3ed0e829eb7de03750d68c6579b6dc1cf7811f01878398adf131dbe829eb98fd1b9435634ffa3934c798fd3d703888d95a1fb38d9eb28ed9ff82b266ec9dadf3cd3166a5afa93a5ff84c9f2f9c0bb63f685b67b07dae6de781ed8fda763ed8bed0b62e60fb93b65d00b63f6b5b39d8fea26d5dc1f6576d4b82ed6fdad60d6cffa66dddc1f6efdad6036cffa16d3dc1f6776deb05b67f685b6fb0fd53dbfa689b7ade257dafe4bcb52df05705f16e5be97729eb96f9ae39f0dddef0dd3e87be3b18be3b587c271df84e800f998a8cf92ac827ddf29497020ffaea1ebfaf6eaaeedd82c6d7bd3bf0f47050f704f8680c4f0fe0e9193f4faaff6faff8d79bdac6dd0c4d13e0ab1bd4abb7837a15812f59b7cc8bbf52b061dbdadbc2d8277ec66411f89275cb7c1f60141bb6f5f2ce95ec3fea78d8a9a89ed7c1be943a27427f55c021fe8aa1cc151debcb76d66c25f07f3ceef5346c8ee2321517e24bd62df3e2af04ead333f78cc9c632f630185db51145e04bd6ed7dd76f07c9e371dcc1b58eb54d13df1539f0ddc7f0ddddf08d6da74c998e6d7d8039f66b4e7d6cab8c7fbde5787d22d786e207cf1ff01a2eae3aa16fb936143f622f86fc3545f565a59ce821edb0b0ab58966d89ece672bd8de54aa14c85a5fe5541bcf5af34782a0d6675bcb9088e850ef687540c54181c32df1db4ab8cd0ae02b49332678376aedab3be068fccf7041e69c77a018fab6ba2289e5c5c8f1dcc379ec3e2f5b3fc1fcf035c6dafae06a3ccdbb6571f60b49dab38b89ec978aed20318c5d61778ba39d22c6abb7623f1ed205652ed91f8907373d97fc55f3194e9d3b2beec5dd056ba88118c47991a7bcd1bff764aa6aec17b64c183dbcec175555747f1588ef76fbe0ce28d35b35dea616815758fc7555bdecde09179f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f199f2761bf2d29d79384d1ecffe6ea3e7feafb877a5df80ce87f3bed0f962cc7fe31d20fe25ca3cec550a6b4453ddbff83fe60e6732aec23d9d3ad76a96d89fd31ab605efc615f2bdc960cfd9dca62f39d1ce5ea799bfa0698fa8ea6d9f7b3a7455317fd9f51d3224353ec8f7f9ec1a3e2b4b2653d9b8b677fd93e8b44ad241fe7b3bdd2c01eebf16f97648367d62d8286ed071e675cf5df91b65a9e975718be8ba1cc892deab70df6b3aa823ac872d8ef47d62dcb9c0bcb561aeb6eaf97158ed6c6fa7bc1b252e6146853f7b5a8d7cc415b99ccb6ef3a3e378fff389c7e8edf2d0b9eaec0e3a29d7174be518efb40dccff1cdfe69b6f31829837dfb1cf4abccd8df49fc7966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563ce6b3567cbfb63b09638efa3ea49e67c8b7caf0d9d4c616f57e5d3f8793674e9d8d3ae3bba3ff6c51cfb655e74b82aff67788da96aebe4f11b52dc51f7e7b069f05b978ae5b04be64dd498b16922f8bcd77fa39be8bb121e4397e3743d7ee164d5dedaff88c1535c5fdb587c183cf46a3beed93346c2efb0e45c585f8c37d290936c9e3fbd12eb6331e4bcc7e3de20f9f5f7f476bdb3e70b5ed93e52edb0d79362fcfeabb59ea2a657e086ddf8f751efb7060df91cf2cff9729d3736ad14fd5d9c1f735cb8b605db27d6ddff61c08ac31f9ee8aeb2ad269a0a14131e43f6d515f56ca4959d15ad8d53e22df80417673b91ec672a550a6bfa5fe5541bcf537bfb53ac06056b1f33388b3cfe0f8efaa4dea1fa1d1b9a0919471fccd466bff4ab35f21b6a36d8c32b22c7e8beeafd04645f51fb51d031c7c5b38e33100bfb76b1e171ad3cfb3d0fb69fd37b41771f7d3fa6f8821eca71518ebef0ceb17ae3641f4b145cafc5f63fde639b92c83fdc0feb59fc0f75c923a9fcd39f9a1babeb29d93e3725175c77d33eee313c604b2603c4999765a6bd9669511dc7d2ccb96462c2b5a99df0a2b09beaa9f9befaca5f7f901465d24aef11be452e628a88b9bf396f439a0ab6fcac9baa41d485aea2a658e877ded049d4fc076c2b6f91ccbff65ca740e8863b85f187f9d53dbf722bd2ed9be175a7c5f0cac31f9ee8abee51c50fc88bd18f267b7ac2f2be5440fd15ad8d53e22e751c86e2e57612c570a65065aea5f15c45bff0b0d9e0b0d66153b27439c9d03fdd05db5d5032334ea0c1a4919bca768fb0ea8ed5e87abf737a2cea5f0fd25f33e011e27dd9c37d9cf63cdfb6ab67384ce063f9e23f482763661296bde2f94e3659cfd86f15d895ee017df9570f5ede6bea05b15cce379c1a1f4ede23bb6ca5fd498097d73e03b6acc845cf8ee60f8ee9043df5e73af3993e60ec62048bd7f86df2c5553a6f3521c9740966b018c2ec67248040dbf3d7e30461cdf41966b098c2e8e0fd97efbbc1730ca72c5c0e8e2dd521c7fa3318cf88d613cce0ba3836fc5766deab762f19e5e6b60647a67139f4db5014617e7c54d7d570fcfe7dbc2afab7189ba65c198044659ee306074716f1caf651ac388d745b25c3b6074f10c2bdbf19df0dbf3786fd92563a663bbe3be28c96cefbd54bae5c978ae81be1d3c7b486981f7190fa6453fb73c19cf7dd0b783fb7e292d709cc1836981cf065d8c7b98081a3e873b180f3ebf94e58e04c62a478c03b260ac02c67fdd2b06c6818e18abb2601c088c623f1a181ddc7f4d310ecc8211ef53ca72c700e3458e182fcc82f1226094e58e054617f75213e0b7318c1703a32c771c305ee288f1e22c182f014659ee7860bcd411e32559305e0a8cb2dc3780f132478c9766c1781930ca722700e3e58e182fcb82f1726094e54e04c62b1c315e9e05e315c028cb9d048c573a62bc220bc62b8151963b1918af72c47865168c5701a32c770a305eed88f1aa2c18af064659ee54601ce488f1ea2c180701a32c57068cd738621c9405e335c028cb7504c66b1d315e9305e3b5c028cb9d068cd73962bc360bc6eb8051963b1d18af77c4785d168cd703a32c770630dee088f1fa2c186f004659ee4c60bcd111e30d5930de088cb2dc59c0789323c61bb360bc09186fb4300e76c47853168c838151963b0f186f8e9f31752d3d380bc69b81e796f879529add9c05cf2d6e7952dfd5bbd9e2ebd6f87da5b6c590a0f175bf157886c6cf93da16b766c1230ca5b01c6a765bfc8c29cd8666c1781bf00c8b9f27a5d96d59f00c03cd6eb368767bfc8c29cd8665c1783bf00c8f9f27a5d9ed59f00c07cd6eb7687647fc8c29cd8667c17807f08c889f27a5d91d59f08c08ea35bbc3a2d9c8f819539a8dc8827124f054c7cf93d26c64163cd5a0d9488b66a3e2674c69569d05e328e0a9899f27a5d9a82c786a40b35116cd46c7cf98d2ac260bc6d1c0531b3f4f4ab3d159f0d48266a32d9add193f634ab3da2c18ef049e31f1f3a434bb330b9e31a0d99d16cdc6c6cf98d26c4c168c6381e7aef879529a8dcd82e72ed06cac45b3bb1d31de9505e3dd169eb8bf937d97c5d77847751f1734beeec2500acb613f89098e18c767c13801186539ec2751e7887142168c75c028cb251c3366ea275107be27c6ef3bd52ed5058dd767a25b9e8cfd24d0f724475a4c0c1aafc524b73c19fb49a0efc98eb49814345e8bc9c033c5811609f0d1181e612885e5b09fc454478c53b2609c0a8cb21cf69398e688716a168cd3805196c37e12f738629c9605e33dc028cb613f89e98e18efc982713a30ca72d84fe25e478cd3b360bc17186539ec27719f23c67bb360bc0f186539ec2771bf23c6fbb260bc1f186539ec27f18023c6fbb3607c00186539ec27f1a023c607b2607c10186539ec27f19023c607b3607c08186539ec27f1b023c687b2607c18186539ec2731c311e3c35930ce0046590efb493ce2887146168c8f00a32c87fd241e75c4f848168c8f02a32c77b763c64cd72f8f3673df51d72acddd77d4754973f7ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe74cbe1f73e03b013e642a32e6ab202f0ca5b0dcdd9eb15933224f597c3ce55877f4f54d82ba7fd3c253e4a8eee8eb7182ba0b43be313e96078cb88f7b1d9bcee858c764531915cf138e781ecf82e709e079d211cf1359f03c093c4fc5cf938aa927b3e011865258eeee3c607c2c0f18bd8e5e472646af63e1e8e8193da367f48c8782311fda70cf9817f1986c2aa3e299193f4f4ab3a7b2e099099ac972b7b8654c369551f1cc8a9f27a5d9cc2c78668166332d9a39604c369551f1cc8e9f27a5d9ac2c78668366b32c9a39604c369551f1cc899f27a5d9ec2c78e68066b32d9a39604c369551f1cc8d9f27a5d99c2c78e68266732c9a39604c369551f1cc8b9f27a5d9dc2c78e68166732d9a39604c369551f1cc8f9f27a5d9bc2c78e68366f32c9a39604c369551f12c889f27a5d9fc2c78168066f32d9a39604c369551f12c8c9f27a5d9822c781682660b2c9ab132de9d078c8fe501a3631d934d65543c8b1cf12ccc826711f03ced886751163c4f03cf33f1f3a462eae92c7884a11496bb3b0f181fcb0346afa3d79189d1eb58383a7a46cfe819b363fc661e30fa6ded1959191d5c5f657c87e6e966ee3bea1d9ae6ee3bea1d9ae6eedbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece997c3f1bbfef64b6df987916785c7cf3c6513dcbd57a9fd3ebfa3246fd9456cf1b5a3d6d68550a659e03fd9e77a05f11f89575cbbcf8cb96b91301b323dfc9c3c3751c06f5171f8f197a28ff2f38aa7b545bff4233f71dd5d63777df516d7d73f7ede3dcc77921f8f671eee3bc107cfb38f771cee21bf3ad82faf376f9fea95ac78bf0ff22282fdf152e863253daa47fdb077e1f72e1dbef43fe585108be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671ce17e7180f9539e0090c9e2003cf42329e69643c73c878c690f10c23e3b9968ce722329e07c978ba93f14c24e31945c6733319cf95643c1790f1f427e3994ec6d3878c672e19cf5d643c4f92f10c27e3b99e8ce712329e87c97892643c93c9784693f1dc4ac67335194f1519cf7d643cbdc878ce21e3194fc6338f8ce76c329e11643c4f91f1dc48c67338194f7b329ecbc8781e27e3399f8ca7828ce711329e05643c53c978ee24e3b98d8ca79c8ce71a329e2e643c1792f13c40c6d3838c673e194f1d19cf4c329e6a329ec1643ce792f15c41c6d3928ca71f19cf22329e7bc878fa92f18c25e3e94cc6733b19cf75643c1793f13c44c6d38d8c671219cf2c329e1a329e21643c5791f10c20e3b9978ca73719cf38329e4e643c7790f1dc40c6938bef9966c35342c6534ac6732919cfa3643c33c878ba92f14c21e3994dc6534bc633948c671019cf40329efbc9787a92f14c20e31949c6731319cf13643c4790f17420e3b99c8ca7888027117c750c9304fcff59b0b53096559f7d9ddbb1feff2f697b0b58e6659d6f6959f74b60936fc9be6c5916757a09ea52a5f3e55f6f4ae984beaa605efc9500c7cb243c9793f17420e339828ce709329e9bc8784692f14c20e3e949c6733f19cf40329e41643c43c9786ac9786693f14c21e3e94ac633838ce751329e4bc9784ac9784ac8789e25e3b9818ce70e329e4e643ce3c8787a93f1dc4bc633808ce72a329e21643c35643cb3c8782691f17423e379888ce762329eebc8786e27e3e94cc633968ca72f19cf3d643c8bc878fa91f1b424e3b9828ce75c329ec1643cd5643c33c978eac878e693f1f420e379808ce742329e2e643cd790f19493f1dc46c6732719cf54329e05643c8f90f15490f19c4fc6f33819cf65643cedc9780e27e3b9918ce729329e11643c6793f1cc23e3194fc6730e194f2f329efbc878aac878ae26e3b9958c673419cf64329e2419cfc3643c9790f15c4fc6339c8ce749329ebbc878e692f1f421e3994ec6d39f8ce702329e2bc9786e26e31945c633918ca73b19cf83643c1791f15c4bc6338c8c670c19cf1c329e69643c0bc9782a2d3ccf3ae291f7dd65dd32ff2c896f07dba15cadf71547757a55afabb55eaff08bbf622833a35dfa573dffc06585cbfc3e01be9bf32a68f4aaa3bac8f62832b60ffa7ed1916f737c3e997fb199fb6e6ff86e5f20be3b18be3b14886f1fe73ece0bc1b78f731fe785e0dbc7b98f7326df0eae0d92f89d34998a8cf92ac8e3f5828befcb39aa6783ebc42f63d44f69f59aa195796d550a655e01fd5e73a09fedda53e6c55fb6cc9d0898312eca8278e36271fc754aaa7e878781ae8b0d7db15e4b1c691a750c59d2cc7d471d439abbefa8634873f7ede3dcc77921f8f671eee3bc107cfb38f771cee4fb759d8ff1bab11c7db40aeaaf075e07bfcb74be2846bf6a5d4bc16f117088bf6228f3bfe0b9a6dfe7fd3e1f976f7f6cf3715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e09b39cecdbcf4173f1bd85cf5e78f8ac55cbc4b70287d47c56273f71d158bcdddb78f731fe74cbe973bf09d001f3265eae3b71c78963ae07154cfd4b38d15469d9e35ea540a65f018bfc2413d8bc0afac5be657008f4c95c0e3220e1ab3cd91672119cf34329e39643c63c8788691f15c4bc6731119cf83643cddc9782692f18c22e3b9998ce74a329e0bc878fa93f14c27e3e943c633978ce72e329e27c9788693f15c4fc6730919cfc3643c49329ec9643ca3c9786e25e3b99a8ca78a8ce73e329e5e643ce790f18c27e39947c633828ce729329e1bc9780e27e3694fc6731919cfe3643ce793f15490f13c42c6b3808c672a19cf9d643cb791f19493f12c21e3b9868ca70b19cf85643c0f90f1f420e3994fc65347c633938ca79a8c673019cfb9643c5790f1b424e3e947c6b3888ce71e329ebe643c63c9783a93f1dc4ec6731d19cfc5643c0f91f17423e39944c6338b8ca7868c670819cf6b643c5791f10c20e3b9978ca73719cf38329e4e643c7790f1dc40c65342c6534ac6732919cfa3643c33c878ba92f14c21e3994dc6534bc633948c671019cf40329efbc9787a92f14c20e31949c6731319cf13643c4790f17420e3b99c8ca7888027117cf5ddff04fcff35b0c93beacf82ed0d9d5f0ab616161f2d757e05d88a755ed6d1264c2f74fceaba512757efe5a3af2a98177f25c0f10609cfe5643c1dc8788e20e379828ce726329e91643c13c8787a92f1dc4fc633908c671019cf50329e5a329ed9643c53c878ba92f1cc20e379948ce752329e52329e12329e1bc878ee20e3e944c6338e8ca73719cfbd643c03c878ae22e3798d8c6708194f0d19cf2c329e49643cddc8781e22e3b9988ce73a329edbc9783a93f18c25e3e94bc6730f19cf22329e7e643c2dc978ae20e339978c6730194f3519cf4c329e3a329ef9643c3dc8781e20e3b9908ca70b19cf35643c4bc878cac9786e23e3b9938c672a19cf02329e47c8782ac878ce27e3799c8ce732329ef6643c8793f1dc48c6f31419cf08329e79643ce3c978ce21e3e945c6731f194f1519cfd5643cb792f18c26e3994cc69324e379988ce712329eebc9788693f13c49c6731719cf5c329e3e643cd3c978fa93f15c40c6732519cfcd643ca3c8782692f17427e379908ce722329e6bc9788691f18c21e39943c6338d8c6721194f656e7892eadd76e96b1d00174e55905f013c4b1ce8e3a89ee5f85d832f635cafd2ea4d43abd70cad4aa1cc72d0ef4d07fa15815f59b7cc8bbf7c64563c8feabced3b108f92308a6d895b9ed47efb68d070cab4dfbe093c2eda3547f54ced5f2b8d3a3d6ad15dca60acae74504fdbbe23f32b613be41bb3e2795ce7853501e51e276114db0ab73ca9fdebf1a0e19469ff5a093c2eda1f47f54ced5fab8c3a3d6ed15dca60acae72504fdbbe23f3ab603be41bb3e27942e7853501e59e206114db9b6e79ba27a0ce3265dabf56018f8bf6c7513d53fbd76aa34e4f5874973218abab1dd4d3b6efc8fc6ad80e9ed933db98158f3cdb11d604947b9284516c2b9df2742f4f409d65cad48ead061e17edbc23dd53edd81aa34e4f5a74973218ab6b1cd4d3b6efc8fc1a8befb2205e2dd636428bb5169eb539d642fc65cbbc3c0f99bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da3981974563cf2ed4a614d40b9a74818c5b6ca2d4feabda0a782865391315f05f9b5c0b3da813e8eea99ea43becea8d35316dda50cee5feb1cd4d3b6efc8fc3ad80ed930afc94366af73d39815cf4c9d17d604949b49c228b6d56e7952edd8cca0e194a91d5b073c2eda7947f54cb563eb8d3acdb4e82e6570ff5aefa09eb67d47e6d7c376f0cc9ed9c6ac7866e9bcb026a0dc2c1246b1ad75ca934cbddf382b6838656ac7d6038f8b76de91eea9766c8351a75916dda50cc6ea0607f5b4ed3b32bf01b64336cc6bf290d9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a178ece8a67b6ce0b6b02cacd266114db3aa73cdd52cf1d66070da74ccf1d3600cffad879d2cf1d1ce89e7aeeb0d1a8d36c8bee5206f7af8d0eea69db77647e236c87e6cebc260f997d6ce486d9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a398196243f1ccd179614d40b939248c625bef9627f5dd833941c32953bf9d8dc0b3c1813e8eea99eab7b3c9a8d31c8bee5206f7af4d0eea69db77647e136c07cfec996dcc8a67aece0b6b02cacd256114db06b73ca9766c6ed070cad48e6d021e17edbca37aa6dab1cd469de65a74973218ab9b1dd4d3b6efc8fc66d80e9ed933db9815cf3c9d17d604949b47c228b68d6e7952edd8bca0e194a91ddb0c3c2eda7947f54cb5635b8c3acdb3e82e653056b738a8a76ddf91f92db01d3cb367b6312b9ef93a2fac0928379f84516c9bdcf2241350679932b5635b80c7453befa89ea9766cab51a7f916dda50cc6ea5607f5b4ed3b32bf15b643be312b9e053a2fac0928b78084516c9bddf2a4f6af0541c329d3feb515785cb43f8eea99dabfde32eab4c0a2bb94c1587dcb413d6dfb8eccbf05db21df9815cf429d17d604945b48c228b62d6e7952fbd7c2a0e19469ff7a0b785cb43f8eea99dabfb619755a68d15dca60ac6e73504fdbbe23f3db603be41bb3e259a4f3c29a80728b4818c586c78b458e784a0d9e528b1687cab79aafd0f912fd9b80ff5700a3abf67091c128f318e3c8eb5ab3f6064f7b43b343e95bd5bf52e70fd7bfb8bd2a8191617bb5cf81661d0c9e0e866687d2b7d2a29fce1fa17f717bf5034686edd501781cb4cfdd13068f9a329d6f6c73ac8fa37aa6ce37b60776ddf1382465f0d8bddd413d6de71232bf1db68367f6cc3666c53358e7853501e50693308a0daf5376c4cfd33d61f0a829533bb6c3b13e8eea996ac7de0eecbaef00dda50cc6eadb0eea59047e65dd32ff366c876c98d7e421b3d7b969cc8a6788ce0b6b02ca0d216114db76e079277e9eee0983474d99dab1771cebe3a89ea9766c6760d7fd1dd05dcae0feb5d3413d8bc0afac5be677c276c886794d1e327b9d9bc6ac7886eabcb026a0dc501246b1bd0d3cbb62e7498f07843c6acad48eed72ac8f9b7aa6dbb17703bbeebb40772983fbd7bb0eea59047e65dd32ff2e6c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a6798ce0b6b02ca0d236114db4ee0792f769ef47307e45153a6e70eef39d6c74d3dd3cf1d760776dddf03dda50cc6ea6e07f52c02bfb26e99df0ddbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219aef3c29a8072c34918c5f62ef0ec899fa77bc2e05153a6e70e7b1cebe3a89ea9e70e7b03bbee7b40772983b1bad7413d8bc0afac5be6f7c276d8eb993db38559f18cd079614d40b911248c62db0d3cfb62e7493f3f451e35656ac7f639d6c74d3dd3edd8fec0aefb3ed05dca60acee7750cf22f02beb96f9fdb01db2615e9387cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7b97074563cd53a2fac0928574dc228b6bdc0f37eec3cddca13068f9a8a8cf92ac8bfef581f37f54c3f773810d8757f1f749732b87f1d7050cf22f02beb96f903b01d9a3bf39a3c64f6b1911b661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e6266880dc553a3f3c29a807235248c62db0f3c1fc4cfd33d61f0a8a9c898af82fc078ef57154cf54bf9d0f03bbee1f80ee5206f7af0f1dd4b308fccaba65fe43d80e9ed933db98154fadce0b6b02cad592308aed00f07c143f4f3261f0a829533bf691637d1cd533d58e7d1cd875ff0874973218ab1f3ba86711f89575cbfcc7b01df28d59f18cd179614d40b931248c62fb10781cc45d8aa7d4e091f98f087cabf93a9d2fd1bfb8bdea8091617b95e640b3f6064f7b43b343e95bd57fa2ce1fae7f717b4d044686edd53e079a7530783a189a1d4adf4a8b493a7f84fec5ed35091819b657871c687628dbc343b96f1fca38f59a1f3acd8b0ea1e6458750f322af3995e60e8e2f493c9605c0805315e43f069e6fc7cf93ba2ff771163cdf069e6fc5cfd3d5513dcbd57abf03ec71ad5769f55d43ab8f0dad4aa10c327cd7817e45e057d62df3e2cf337be628663cb715d60494fb8884516cdf021e17ed86aafbf97a5db2fe5661fae4e87abf2e9e97e0bde2d67abdc221fe8aa1cca4b27ab6df69b612f8bf6c37559f0386cdd13bcc5d6dcfed645efc950439bb779bf15e326ae1e27953b6c7fd03169e2fe3e329c7fd1c7ded7754f76c9efdedb7f0c458f7ae51cf3df7c55ff754fbd145af4bd6aff6d1ff71b453cdbbe3be27ed4717a3cec5506650593ddb7f42fb616b2b5cef9b724e6eee9b2d82faf64cb8cab4dd7c26f4a5b64bb90fa03cb63915fa17f7cf0aa8abab7631ea1e13b68b66dbed527bf3b9a4e9bb1474f9805433db730ad4b1d2c25d49c08df198cbfd4cd66d7b465669e8c8a6196eeb0f2c3af6b370f723e066dcaffb193ab26976b0fd7ab0857b300137e37e3dd8d0914db383edd7432cdc4308b819f7eb21868e6c9a1d6cbf1e6ae11e4ac0cdb85f0f357464d3ec60fbf5300bf730026ec6fd7a98a1239b6607dbaf875bb887137033eed7c30d1dd9343bd87e3dc2c23d82809b71bf1e1134d4914db383edd7d516ee6a026ec6fdbadad0914db383edd73516ee1a026ec6fdbac6d0914db383edd7b516ee5a026ec6fdbad6d0914db383edd7632cdc6308b819f7ebc6f6db67ddafeb2cdc7504dc8cfb759da1239b6607dbaf275ab827127033eed7130d1dd9343bd87e3dc9c23d89809b71bf9e64e8c8a6996dbf76f42e61d6ef367ee8549ff418d31f66c1f33ef0b88829477150eea89f4baa6fea3e43ab0f0dad70ec8efda09f83be3019bf4920fe3cb367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed933f333e37719f1f98a94fb8084516cf84ccac57d7e55f70bf4ba64fdadc234e8d87abffb63f79b2c471d5aebf50a87f82b8632279c5acf76bd662b09bebadd702c6edc967b63af437a5b9af12ff3e2af04eab30f781cbc9f9fe2d96ff0ecb76881ef9dc6e33b39ca8dc6c972f57dbcc382faedbcd7a80f6aba2776ff0d352d3234dde3d8772268b83d8501a72ac8238f8b67c38eea996a0b761b7532352e85329da09ebb1dd4b308fccaba657e37f0c8d402785cc56060f004167d64aa24e39946c633868ce70c329e61643cc793f15c4bc6731819cf45643c0f92f17427e39948c6338a8ce754329e9bc9788e22e3b9928ce702329e62329efe643cd3c978fa90f1dc45c6731619cf70329ef3c8784e20e3b99e8c2741c6730919cfc3643c49329ec9643ca3c9783a92f1dc4ac6730c19cfd5643cadc978aac878ee23e3e945c6730e19cf78329eb3c9784690f19c44c6732319cfe1643cedc9782e23e379848ca7828ce77c329ea9643c7792f19c4ec6731b194f3919cf71643cd790f17421e3b9908ca72d19cf03643c3dc878eac878aac9784e21e3194cc6732e19cf91643c5790f1b424e3e947c6730f194f5f329eb1643c9dc978ce24e3b99d8ce71b643cd791f1b423e3b9988c671f19cf43643cddc8782691f1d490f11c20e32923e31942c6733419cf55643cadc8780690f1dc4bc6d39b8c671c194f27329e3bc8784e24e3b9818ca7848ca7948ce752329e19643c5dc978a690f1d492f19c46c633948ce758329e41643c6dc8780692f1dc4fc6d3938c670219cf48329e93c9786e22e339828ca70319cfe5643c45043c89e0abdf624ac0fff7834dbe19f43ed85a58d627cfa9a5bc3a2e2eedf8d575b7b0ac7b8f8501757a0fea52a5f3e55f6f4ae984beaa605efc9500c71e129ecbc9783a90f11c41c6731319cfc9643c23c9782690f1f424e3b99f8c6720194f1b329e41643cc792f10c25e3398d8ca7968c670a194f57329e19643c9792f19492f19490f1dc40c6732219cf1d643c9dc878c691f1f426e3b9978c6700194f2b329eabc8788e26e31942c65346c673808ca7868c6712194f37329e87c878f691f15c4cc6d38e8ce73a329e6f90f1dc4ec67326194f67329eb1643c7dc978ee21e3e947c6d3928ce70a329e23c978ce25e3194cc6730a194f35194f1d194f0f329e07c878da92f15c48c6d3858ce71a329ee3c878cac9786e23e3399d8ce74e329ea9643ce793f15490f13c42c67319194f7b329ec3c9786e24e339898c670419cfd9643ce3c978ce21e3e945c6731f194f15194f6b329eabc9788e21e3b9958ca72319cf68329ec9643c49329e87c9782e21e34990f15c4fc6730219cf79643cc3c978ce22e3b98b8ca70f19cf74329efe643cc5643c1790f15c49c6731419cfcd643ca792f18c22e39948c6d39d8ce741329e8bc8780e23e3b9968ce778329e61643c6790f18c21e39946c65349c6d3c2e0c1ffab77c3f6e9bc7c3ba818fe3f59772e6fafd72565e419b1ba57f1ae6153f5dde5a8beef06f55315ccef82fa0afbbbc0f3ae239ef70c1ed37709e42b41b39d864d31bee38871a7c128f3ef00a3e8b71378763ae2d965f098be4b20df0f347bdbb029c61d8e18df3618657e07308a7e6f03cfdb8e78de31784cdf25901f0c9a6d376c8a719b23c6ed06a3cc6f0346d16f3bf06c77c4b3c3e0317d97407e0868f69661538c5b1d31be6530cafc566014fdde029eb71cf16c33784cdf25901f0a9a6d316c8a71b323c62d06a3cc6f0646d16f0bf06c71c4b3d5e0317d97407e1868b6c9b029c68d8e1837198c32bf111845bf4dc0b3c911cf6683c7f45d02f9e1a0d906c3a618d73b62dc6030cafc7a6014fd3600cf06473c1b0d1ed37709e4478066eb0c9b625ceb88719dc128f36b8151f45b073ceb1cf1ac37784cdf2590af06cdd61836c5b8da11e31a8351e65703a3e8b70678d638e2596bf098be4b205f039aad326c8a71a523c65506a3ccaf0446d16f15f0ac72c4b3dae0317d9740be16347bd3b029c6371c31be6930cafc1bc028fabd093c6f3ae25969f098be4b203f06345b61d814e372478c2b0c46995f0e8ca2df0ae059e188e70d83c7f45d02f93ad06c9961538c4b1d312e3318657e29308a7ecb806799239ee5068fe9bb04f21341b3d70d9b625ce288f1758351e69700a3e8f73af0bcee8867a9c163fa2e81fc24d06cb161538caf39625c6c30cafc6bc028fa2d069ec58e7896183ca6ef12c8df0836e1ed0bb65775be0fd85ed1f9de607b59e77b81ed259def09b61775be07d85ed0f9ee607b5ee7bb81ed399d4f82ed599def0ab66774be3fd89ed6f901605ba4f355605ba8f303c1b640e72f04db7c9dbf086cf374fe62b0cdd5f94bc03647e72f05db6c9dbf0c6cb374fe72b0cdd4f92bc0f694ce5f09b62775fe2ab03da1f35783ed719d1f04b66feafc35607b4ce7af05dba33a7f1dd8eed6f9ebc1768bcedf00b60f75fe26b07da4f33783ed639dbf156cdfd2f9dbc0f66d9dbf1d6cdfd1f93bc0f65d9d1f09b6efe9fc28b07d5fe74783ed073a7f27d87ea8f363c1f6239dbf0b6c3fd6f97160fb89ce8f07db4f757e02d87ea6f393c1f6739d9f02b65fe8fc54b0fd52e7a781ed573a7f0fd83ed1f9e960fbb5cedf0bb6dfe8fc7d60fbadcedf0fb6dfe9fc0360fbbdce3f08b64f75fe21b07da6f30f83ed0f3a3f036c9febfc2360fba3ce4bbba6dad93fe97c59106f3bfb45503f95816ff1a7cafc59e7db186564d962287396ee50a89e71a86f994a3b2cedb2b2493bfc2ad8a41d7e056cd20ebf0c3669875f029bb4c32f824ddae117c026edf0f3609376f839b0493bfc2cd8a41d7e066cd20e3f0db62a9d5f0436698717824ddae105609376783ed8a41d9e07366987e7824ddae1396093767836d8a41d9e0536698767824ddae1a7c026edf093609376f809b0493bfc38d8a41dfe26d8a41d7e0c6cd20e3f0a366987ef069bb4c3b7804df6972fc0266df3876093b6f923b049dbfc31d8a46dfe16d8a46dfe36d8a46dfe0ed8a46dfe2ed8a46dfe1ed8a46dfe3ed8a46dfe01d8a46dfe21d8a46dfe11d8a46dfe31d8c6ebfc4fc0266df34fc1266df3cfc0266df3cfc1266df32fc0266df32fc1266df3afc0266df3276093b6f9d76093b6f9376093b6f9b76093b6f9776093b6f9f76093b6f953b049dbfc19d8a46dfe03d81ed17969abdb824d9e15aba9fc6b4e380e4f0bf0252c5541bc6d3f4e5590c7bacb5449c633978c670c19cf8b643c6790f10c23e3399e8ce730329ec5643c13c9781691f1ac20e3594ec6f31a19cfa9643c9bc8783692f11c45c6f32e19cf2e329e0bc8788ac9786693f13c4fc6731619cf70329ef3c8784e20e34990f12c20e35946c6b3948ce715329e8e643c1bc878d693f11c43c6b3938ce71d329ed6643c5f90f1cc24e339878ce759329eb3c9784690f19c44c67338194f7b329e0a329ef3c978e691f1bc4ec6b3848ce725329ed3c978d691f1ac25e32927e3398e8ce76d329e1d643c5dc878da92f13c49c65347c6f334194f3519cf29643c83c978ce25e339928ca725194f3f329e5bc878e690f1bc40c6d3998ce74c329e35643cabc9783e27e3f90619cf76329e6d643cedc878f691f14c22e35948c65343c6f32a19cf01329e32329e21643c4793f1b422e3f9908c671619cf73643cabc8785692f19c48c6f31619cf56329e12329e52329ef9643cb5643c2f93f19c46c633948ce758329e36643c4f91f13c43c6f32619cf1b643c2793f16c21e3d94cc67304194f07329edd643cef91f11411f0248023009bfcbf25d8e43b3c07c0f699ceef039b7cc36731d83ed5f947c0f690c5d6c2c2270c33c026efca7e0636b93ff330d8e49d894fc126e70de25fcdafeef855fe16b08cf86969e1477f9f5ab8248fdb5b96a90ae2dddee8ab2ab07ff3aec8603cd43cef91f1ec26e3e940c6730419cf66329e2d643c2793f1bc41c6f32619cf33643c4f91f1b421e339968c672819cf69643c2f93f1d492f1cc27e32925e32921e3d94ac6f31619cf89643c2bc9785691f13c47c6338b8ce743329e56643c4793f10c21e32923e33940c6f32a194f0d19cf42329e49643cfbc878da91f16c23e3d94ec6f30d329ecfc9785693f1ac21e339938ca73319cf0b643c73c8786e21e3e947c6d3928ce748329e73c9780693f19c42c6534dc6f334194f1d19cf93643c6dc978ba90f1ec20e3799b8ce738329e72329eb5643cebc8784e27e379898c670919cfeb643cf3c878ce27e3a920e3694fc6733819cf49643c23c878ce26e379968ce71c329e99643c5f90f1b426e379878c672719cf31643cebc9783690f17424e379858c672919cf32329e05643c09329e13c878ce23e3194ec6731619cff3643cb3c9788ac9782e20e3d945c6f32e19cf51643c1bc9783691f19c4ac6f31a19cf72329e15643c8bc8782692f12c26e3398c8ce778329e61643c6790f1bc48c633868c672e194f25194f0b0bcf01473cf2ad1859b7cc1f68e6be7719be771588ef770cdfef1488ef1d86ef1d05e27b9be17b5b81f8de6af8de5a20be371bbe371788ef8d86ef8d05e27bbde17b7d81f85e6bf85e5b20be571bbe571788ef9586ef9505e2fb0dc3f71b05e27bb9e17b7981f85e6af85e5a20be9718be9714886fe6eb6ff59d30e9abbc5bff26e0ff15c0b8d811e3018351e61703a3d8f07bd4158e78a2aedd2b087c2b2de45e963cf34cc0ff2b81d1554c55188c326f8ba95dc053e98827ea9e4325816fa585bc8b2d7d2a13f07f1c7fd9554c551a8c326f8ba97780a79f239ea87b25fd087c2b2de4dd6779e72f01ffc7f1d65dc5543f8351e66d31b50378063be289bac73398c0b7d242be1526dfa449c0ff717c46573135d86094795b4ce1f8b9431cf144dd9b1a42e05b6921dfda956f5e26e0ff387e93ab981a6230cabc2da670fcb8a18e78a2eea90d25f0adb49067c1f28df604fc7f1830ba8aa9a106a3ccdb620ac7bb19e68827ea5ee03002df4a8be13a2f7dac12f0ffe1c0e82aa686198c326f8ba98dc033dc114fd43dcce104be951623745edee148c0ff4700a3ab981a6e30cabc2da6d603cf08473c51f75e4710f8565a54ebfc3afd9b80ff5703a3ab981a6130cabc2da6d6024fb5239ea87bc6d504be9516353a2fdf9c4bc0ff71fcf7118e18ab0d46991f018c625b0d3c358e78a2ee75d710f8565ac8b7fd57e9df04fc1fc7637515533506a3ccdb620ac783ae75c413758fbe96c0b7d2628ccecb983009f8ff1860741553b506a3ccdb620ac7af1ce38827ead9c21802df4a0bf936d70afd9b80ffd701a3ab981a6330cabc2da696034f9d239ea506cf528b1687cab7d242fa722fd3bf09f8ff44607415537506a3ccdb626a29f04c74c413f52c6722816fa5857c5bfb75fd9b80ff4f0246573135d16094795b4c2d019e498e78a29e414dca81efa8e729b9f01df56c2017bea3ee73e7c277d43ddb5cf88ebaff980bdf51f7d272e13beabe502e7c47dde3c885efa8ebf55cf88ebaf6cc85efa8eba85cf88eba26c885efa8f3db5cf88e3a57cb85efa8f30edf9efbf63c6edf87f2dca150dbf343790c3d94c7127f6de0af0d72e5db1f4bfcb541ae7c17eab5816fcf73df9ecbf55751107d3df68623dfcb0ddf328fcf59963bf2bdd4f02df3f8cc60a923df4b0cdf328ff7bf9738f25d6af896f92539f0dddef0dd3e87be3b18be3b587c3bd8dec944d0f0fa5b1870aa823cc6c0eb0eb47054cf72b5de657a5d5fc6b85edb7d1b737f298532cb403fd76d87acdb6c3bf29119e3a2283edfe509f021df255336797efc2ad8a4dd7f056cd22fe065b0c9b1e925b0c933a917c126cfac5e00db189dff106cf2ec18fbeccbf3ff1d60abd679ec2b3e42e7b7814dfa52611f65e90fb7156cd2a711fbc64abfd4cd6093bec5d82753fa876f049bf4f1c7be80f29ec67ab0c9bb36d8074dde975a0bb67d3a8f7d9fe43b34abc13643e75781ed0f3abf126c0feafc2d60fbbdce7f01b6dfe9fc12b03da0f3af83edb73abf0c6cf7ebfcf360fb8dce3f07b6fb74fe59b0ddabf3f82edbaf75fe3db07da2f3f80ed5749ddf05b65fe93cbebb738fcebf03b65feafc33609ba6f34f836daace2f02db2f747e21d87eaef30bc03645e7e783ed673a3f0f6c93757e2ed87eaaf373c03641e76783ed273a3f0b6ce3757e26d8c6e9fc5360fbb1ce3f09b61fe9fce760bb4be79782ad85ce2f079b8c1989fd548a75fe0db0b5d279ec7f24dff79f04b6363a3f116c6d75be0e6cf26db8316093f1a06bc196d0f91ab095e87c35d8e4fc6c04d864fc93e1609373a961603b42e787824dce7b86804dc6b31c0c36f906693fb01dadf39560936feb5780ed589d3f003619736c31d8e4bb75fbc02663313f0c36f95ef50cb09da8f37f009b8cc3f220d84ed6f9df83ed149dff1dd8e41b9e0f80ad4ce77f0bb68e3a7f3fd84ed3f9df804dc6c8ba0f6c67e8fcbd6093b1837f0d36f9def32760eba4f3d3c176b6ceff0a6c3296c83d6093f1417f09b6ce3a3f0d6cf21deea9603b5fe77f013619efefe760936f0c4f019b8cebf633b075d5f9c9604beafc4fc1d64de72780adbbceff046c3d747e3cd87aeafc38b0f5d2f91f83adb7ceff086c7d745eda19b53fabfd7cbf9eaf0ae23b2f53fede0f1a4e99ae0d840179e23cd72e051ef4b537f6ba2753e7f5b2dfb7d0eb9518da0bbe77c7ee3b7d4db147afab955eef6ec3773194395b370e6ab977e1ff555007590eef63c9ba65990b60d9f78c75b7d7f5dde3a8bebb0d26e1de034c52e6bc53ebcbfe40e7dbc23231b2a5ae8f25d602d010a72ac80b831bad92e578dedb189e3dc0b337769ef4f5ba8b98c07d2beeeb75f33eae196ba5506637e8f79e03fd705f9775cbbcf8f3cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccfac78f6eb3c3e579672fb4918c5b617785cdce7c7e7b0f8ccebbd53ebfdee8ddd6fc3e77badf57acb8d3a1743992fe199d33e9d2f81ffcb768bda960e9e1366dc96e2af04ea83cf82f63be2d96bf0ecb56821f9b2d87c2747b9d13859aefab2a867ecfb0c5df75b3475b5bfeed5eb2a3234c5fdf57d83079f8d9600ef07fa3701ebf900eae0601fcf1817e20ff7a5bd6093fcfbc0e8623be3b144da03791e2efef0b9f8af8ce7e2f16ffb64b9cb76439ef99bcfdbb1ae52e677d0f67daaf3d837643faceb1f96ffcb94e939b5e8a7eabc33fe3aa7b6aff46994edbbd3e2fb6d608dc9778377688a74123f622f86fcdfa13f8794133d446b61c7f1ca91dd5cee7d63b95228b3cb52ffaa20defaef3478761acc2a763e8738fb071cff5db549bb2234ba003492327b41a37d8e78f61a3cc221fe5419d9fe6d8c32b26c3194f99fd046a9ba483b2ff5c4be2d780c78d751fdc497ac5be6c51f9e1bef0146b38e2a3e061d5bcfbb3776defceaffd5a62cfd8bed7a5cfdbf64ddedf5b2c21118eb2f87f5ff8b2b883eb6fc6bfb96d5afdf65ffb27d469d85650f304999f665f5652fd5f96ccef50fd5755bd4b9fe2e073c89a0e1b5b79a321ddff118e3a27d7154cf72dbb1eb3da34ea550a613d4d3c1794cc6778177826f17db1cb59073a8dd8616c550a66359fa57da8e281df15a754f4eea92b49e0f965bea22653a95d5d7a52dd8e36472b9ddf03c4bad77afa5ae52e6bcb2fab25d743e01db09dbd27e96ffcb94a93dc0b178b6c75fe7d4f69577de64fb6eb7f87e0b5863f2dde05b2072be2f7ec45e0cf9cab2fab2524ef410ad855ded23f2ce1fb29bcbed36962b85323b2cf5af0ae2adff768367bbc1ac62a76b597d5ee2c865bbb92342a372d048cae0fd6339b6e37b77b6e3fe5e47dc51c7fdbdc068b69b78eee2926d9fc166de43b59d0f4a195916cf07af2a4bffaa763661296bde1b76711f13df410da01e8151579930061c5c1b76c76b2769a7c44f17b0efd579d1b98ba15d3194195c96fe7578de6dbd77695edfe13585709bfb16befb31b4ac9e1bc74edcab7f4bc0f691fe75749dd6dd76cf50386cf70c4794d5b3e3b2c2f5a1a52ea281946d117cf59efa974659bcef966939336f8e43a9f4fdc82867f383d73cb1bdabd1b5bc1c995a58b4c0fbde52ae28f8ea989bb21f60cc99f751ba18ebc1fb287565e95f6993ccb2aa4dfa1f47d7eb23db51b4c3f60463f27d60acd2f9f2af3775b5d55fe6c59f62fcc0a8839bb62bfdbe5236f781f7018f8bb6dd511b5d8ec7d8b6b1adb74fb5edf8ffbea1550e9fd75a8ff9e633f7b6463e1edfc91adbfd279b16bb2d3cae9ea34469b1dbe23b3e2d7a8eb21d3f6c5ae4b2ef439416ef597cc7a8452ddef7cca4c5bb161e57f7baa3b478d7e23b3e2d7a95677aae815aecb2f0b8baf710a585f8cb96f93d02e6b6463e1edfddab6df7c96c5aecb4f0b8ba6e8ed262a7c5777c5a74ed89f7e83269f18e8527fefb7399b578c7e23b3e2d7af7c17b7899b478dbc2e3ea996e94166f5b7cc71817a36df7726c5aecb0f0ecc8b1163b2cbe633c3fec69bbd766d362bb85c7c17dd78c5a6cb7f88e518b9178df359316db2c3cdb72acc5368beff8b4a8ee61bb276cd3e22d0b8fab7bc2515abc65f11d9f16237b2bdf5b1ba1c5560bcfd61c6bb1d5e23bc66ba8545c6c6984165b2c3c5b72acc5168beff8b4a8499d6b6d6e84169b2d3c9b73acc5668beff8b4284f1d533735428b4d169e4d39d66293c5778c7191ba9edcd8082d365a7836e6588b8d16df311e475271b1a1115a6cb0f06cc8b1161b2cbee3d3a23675ff697d23b4586fe1599f632dd65b7cc778cf251517eb1aa1c53a0bcfba1c6bb1cee23b3e2dbaa58ea96b1ba1c55a0bcfda1c6bb1d6e23b3e2d46a79e89ad6984166b2c3c6b72acc51a8bef18cf3b53edc5ea4668b1dac2b33ac75aacb6f88ef1bc3375ff625523b45865e15995632d56597cc7d876a6ce3b5736428b95169e9539d662a5c5778ce79d292dde6c84166f5a78deccb1166f5a7cc778de993a8ebcd1082ddeb0f0b81a03254a8b372cbe638c8b54dbb9a2115aacb0f0acc8b1162b2cbe63bcaf956a3b9737428be5161e57e3354469b1dce23bc6eb91d43dbe658dd062998567598eb55866f11de3b3a2d439f8d24668b1d4c2b334c75a2c05dffb62f79deecf2d3ea42fd6f98616c550e6948ee95fe98b15a5a3ac03fb95615d5e8fbd2ee97e654b22eaf23ad445ca9c0175691b3819a3a8bba3baa66266b15e97f44dffc0525729734ec7fab29d753e01dbe44358575fcbff652a32e6ab202ffaa93abf1a7f9d53b12a63c8c8f67dd5e2fb65608dc97757f45da493f8117b31e4fb74ac2f2be5440fd15ad8d53ef29ace23bbb9dc5263b95228f39aa5fe5541bcf57fd5e079d5604ebdf700712671e4a6ed4a33bd16a1d1f9a09194c13e7b1f38e231fb100a87f8536564fbb731ca601f4a297321b451d8af54ea9908beda6f52d56fb1a3fa892f59b7cc8bbf52b0ed0346b38e2a3e3e81be9f3256848c23a16c322e4437584f2fc3a6eadadb515dc597ac5be67b03a38c53d12bf78cc9c632f63418154f5f079ae1d81b32653a5ef4059e3e0e781cd533751caa30ead4dba8532994c1771b2b1cd4b308fccaba65be027cbbd8e6a8851c93cf31b4288632238cf3c7281d651d2a7e7b59ead2df715d64ddd22ef5cf81ef4ac3770fc3772268b89d8320f3fe5509ccfd1c30abf50e887fbde578de2631257e7a409d06820671d509d725e779030d6d8b213f0dcef3a49c9495e397b0ab58966d89ece6727d8de54aa14c7f4bfdab8278eb3fc0e0196030ab63f75d706ee7607f48c5407f8343e67b80760322b4eb0fda49193cfef574a45d3f8347e67b028f9ce354804dce15843f01ffef96036eb3ddabb0708b0dc789eb6961ec113f63ea5ca7a7c128f33d80516cfd80a7d29166e6b63ec7d0078fcb6d8c32b26c3194990dc7c684a5acdaef3a15d5d7aba5b6c7f6ee986ed35b3bd00bc7690c409fc0d0502661681bd48fe518274fbba07eacc62953eb268fbc73f40da3d38f1e05add8c0c4df224b355a800df32d2db6206838246531d86448ca56606b61c88243614a7919d2ce855ca887acbbd8e06c0b2c71fac6e13c65ca143a6d80c74528abd091213d75e8dc3279ecd4d1181fad0ccea6c48efa5fcb0ce5a2d6e56a3b98fb4415cc9b3158ecc87f4ba86f15cc8b3fb56d4a757ee2c851770f9c7ce7b4f1a3274c9d8242993b36e68b82861bc0fc8d12dcd54e87018015c6c6a195512f6c30e47fb261dac5cfd91dc7cc35b509c09f4ced40b7c31ce8a6d62f63df8e1a396edc75d3aac78d1d75e9b409a3a68ead9b805bb3ada15cd49696ffb7069bad89c7b26ac2660b976d63b1d9261c65b82dd8e4c87518d884a71dd85a425eca9b5bc649b87682f5cb2ea5fea7c469a52bde26a80f01391cab7655edbfeaf3b1ea34480d75ac8636569b530d5dacee18aaa189d557ecd4d0c36aa86135b4f009417ae8603554f0c9417a2860f5b58bb2203db4ef69417ae8de3382f4d0bc6701dfb781f9ec207ddaa586d6ed1ca487ce55b72ed5abebea336feadd7a75faae6e0ba8535e7589a74e3fd569a7babc50b72fd4ad2c754aa74e97d5a9a03a7d53972303b4d603c37461982e0ad3c561ba244c9786e9b2305d1ea62bc2746598ae0ad3d5611a14a66bc2746d98ae0bd3f561ba214c3786e9a6203dbcf3cd417af87535fcf3ad417a68e8db82f4b0d1b707e921a5ef08d2c34d8f0cd243518f0ad2c3548f0ed24358df19a487b71e1ba487c9bd3b480fb53b3e480fd7ab86c356c364abe1b3d530bf6a486035a4b01a6a580d4bac8630564320aba191ef0fd2432eab219b1f0ad2c33ecf08d323617a344c8f85e99b617a3c4c4f04e9e1c1d5b0e13383f430e36af8f139417ab8f279417a787335ecb91a0e5d0d93ae864f57c3aaab61ded5f0ef6a58f817c2f462985e0ad28f24d4a318f58842ddfe57b7a7d523a2d783f4adf36541fa11b77ae4afba40a82e21aa8bccaa20dd854a7529535dec549743d505537549555d74559765d5855b7569575dfcd52b0fea1510f54a8c7a4548bd32a55e2153afd4a9570cd56ba2eab54bf51ab17aad7a6f90be2dbe3f483f2a55b7c3d5a30175cb5cddbeff384cdf0ad231f99d307d374cdf0bd3f7c3f48330fd30480f6bac863b56c325aba195d530cc6ac8663594b31a0a5a0d1bfd49901e7a5a0d5dfddb203d24f6efc3f469983e0bd2c36b7f1ea63f86e98b30fd294c7f0ed35fc2f4d730fd2d4cff16a67f0fd37f84e9ef61fa4798fe19d40fb38d0dc909baf5d15730c1c8a953478f9f38b56c6a5dd9f869e3a68e9d38eebeb2e963a78e29abbb67f4e4da7175d371e16feb85658cf08193278fbcaf6cec849ad1f796d54d9b5a56575b565d376d424d8383f85ff442277dd5e3c89a9a6867fff57548ff4f139d1ea6db45197dfd8acc752b69d904418e6cca423d5b36ad4293f5114c2e756f4c9f07974d195737b5acbc6c42f8373cf0d64d1f5dd3a50cff37251479cad4b22953474e9e5a563bb96e7c59d72eb8de87db35a112ffddce0dcc9927344d9c4efa3b4b4d0ab15f9eda0405fef3d4a691b62efb1aa4edca9ae6b4acac09353cab290b5dd944c29bca22659932ad7aeae491a3a6462f7cebd759f88ea654734213ab7972c726383bbd290b0decd834c23b9ae26c5616ce82ff0f9c57cf6b845506009b2d6c6f00000028451f8b08000000000000ffed9d77741cc791c6679118164b1024c11ca04433015c2c12012630674a9464e5409004455a24419150b22c4bb224e79cb3e5749673ce675db4efce77bef3d96739fb9c6dc941f7cf3ddfbb7bcfefba67bb8c0fcd9935169a026bb035ef15b7a7b677ead7df54f70eba67874f054190098a5bb5b18b8273377abfcfbde69fded696e0b1f29c9c99947056a584b33a259c3529e1ac4d09675d4a3827a58473724a38a724c869d9aa82915bd2bc5319744d9a319b324deb53a0692e659a4e4b81a60d413ac6a8e929e16c4c09e78c9470ce4c09e7ac947036a58473764a38e7a484736e4a38e7a584737e4a3817a48473614a3817a58473714a3897a484b339259c17a484f3c294705e9412ce8b53c27949829c2b8173a97b7d867b5de65e97bbd715ee953eb3cabdb6b836d6b8fd5663ab2d9bb136efbd82b176631dc63abdf7ba8c751b5b63acc7bdd7ecdeeb35b6d6d83a63eb8d6d30b6d1e9b0c9d866635b8c6d35b6cdd876633b8ced34b6cbd86e637b8ced35b6cfd87e63971abbccd80163971bbbc2d895c69e69ec2a63571bbbc6d8b51ecb75c6ae377683b11b8ddd64ec6663078df51b3b64ecb0b123c6068c1d35768bb163c68e1b7b96b15b8d9d3076d2d8296383c64e1bbbcdd81963678d0d19bbddd81dc6ee347697b1bb3dcd9e6dec1e63cf3176afc7f95c63f719bbdfd803c69e67ec41630f197bd8d8f38dbdc0d80b8dbdc8d88b8dbdc4d84b8dbdccd8cb8dbdc2d82b8dbdcad8ab8dbdc6d86b8dbdced8eb8dbdc1d81b8dbdc9d89b8dbdc5d85b8dbdcdb1504778bbb177187bc4d83b8dbdcbd8bb8dbdc7d87b8dfd85b1f7197bd4d8fb8d7dc0d8078d7dc8d8878d7dc4d8478d7dccd8c78d7dc2d8278d7dcad8a78d7dc6d8678d7dced8e78d7dc1d8178dfda5b12f197bccd85f19fb6b637f63ec6f8dfd9db1bf37f665635f31f60fc6fed1d83f19fbaab17f36f62fc6bee669feafc6fecdd8d78dfdbbf37dc3bd7ed3d5a579b1ff30f62d577edcbd7edbbd7ec7bd7ed7fbccf78c7ddff3fdc0d80f3ddf8f8cfda72bffd8bdfec4bdfed4bdfeccbdfedcbdfec2bdfed2bdfecabdfedabd3ee15e9f74afbf71afbf75afbf73afbf77af4f19bbaca9589e1c0c6f7d41426354c7d1bc5d5321f197062337ab45b57b8f5e9b9dbfc6edd32b6957ebf66b3d7f9ddbaff38e33d9ed4ff6fc8d6ebfd1f3cf74fb333d7f93db6ff2fc73dcfe1ccf7fb1dbbf18fcd900e65c9ddffaaa9d2b033ecad72af0d53a5f35f8eae870e09be47cb5e0a3f35b07be29ce37097c539d6f32f8b2ce3785b43456ef7c7d4152b992efb7c7cd257d5cb70e352d79dec3f6b80d4cbcd393e71db0c76d64e0b5f931c31d6b3ae4cd4ce76b04df2ce79b013e3704fda9cf59df6ce79b05be39ced704beb9ce371b7cf39c6f0ef8e63bdf5cf02d70be79e05be87cf3c1b7c8f916806fb1f32d04df12e75b04be66e75b0cbe0b9c6f09f82e74be66f0d13d2e1780ef62e7bb107c9738df45e0a3b1f662f0d1b5e125ce67c789c919f88cf3d318157e86c667f02da3b1197ccb695c06df0a1a93c1b71262936f158c2be46b713e1aa3ec7bbdaedc1724d5270a619f589bf471cd91ed71d7277fdc70dd6e4330ac6b1fc4590b5a6d74e504ef0d6ac3d819671487fc3550de0575a91ee941df33c46ebf4fd6b9f2c6129febf53e97833aeb22dadf1724dbfef51ecf7a8fb916dacf93b3ed05cdd9516f65e7ecd550d7cf3dbae6998839bb17381872b64b7376d45bd9393b0075fddca3ebde8998b3d7010743cef6f3e46c21af395b9c230b82e8dca3bf7d2662ce1e038ee473b6537376f45bd939fb00d4f5738ffefe9d88397b0770249fb3ddfd7a6d30eaadec9c7d05d4f5738fe6622662ce3e041c0c393ba0e3eca8b7b273f66d50d7cf3d9a179c8839fb6ae0483e677b9872b65d733628ae77064174eed11cf544ccd9478023f99c3dacf3b3a3dfcaced9cf435d3ff768bd6422e6ec475cd9ae337cc3ad332c04df379d6f11f0269fdb473a9872bba0b95dbc0f2408a27394d6ee26626e3fe6ca368f1f877b0fc8f76de7bb007cdf71be0bc1f75de7bb08dac5d007fab50f8c7a2bbb0f7c1feafab94cebc813b10f7c1d381872f6b0e6eca8b7b273f609a8ebe71eddd3301173f647c0c190b3039ab3a3decaced93f405d3ff796b9f244cc59baafd45e2ffcd85d2fac00df4f9c6f25f87eea7cabc0f733e76b01dfcf9daf157cbf70bed5e0fba5f3e5c1f72be76b03dfaf9daf00be279caf1d7c4f3a5f07f87ee37c9de0fbadf37581ef77ced70dbedf3bdf1af03de57c3dce67d7bbe8deabaf3a9f3db7a4515f90ecb9a57b2ce9d8b4bf6a1c623778b11bc63176a317bb3122760b43ec2cc4a02de3edf741b98597279f0b46fefe8362ad4e3e56bb6d7b6b30fab6af069e3c43dbb31063343c79e0694b9e27bcd7b790fc71c373dcea699a8558add0ae7686766520161d9bf6295e0e7c387eb747307624cf58c8402c3a36ed770023f9f0fb84bed7a9ffd8efc3a599615e86be145e1361bc3ee0a0783550e7f7b386ebae706cf5f03e7eb7b6793ea6bc0cf38262d1b1699fe2d5437bdac69fb1305ac6bcc7c835466420161ddb8f8dfdbd65fc351bd579cd81ef3c8c4985b18e49f5c0361ed72971e75a4a6c8eefab0cc4a0b18d34a77835506776f570dd1d30ee32f4bf42b9d76f381e249fc7853cf6ebd1f0b4030f47df67eaaf79fcdeff63906cae757a5ab5795ae5a04e07e8d7c9a05fa9eb108aa7cccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccf299f1fe0b5cdfa47aab843092af003c1cf3fce1f3a3dcb1e8f8765de73bb0ae93fcba45218f6b96748fe172afcd3550e7c9cc30db0f603ddd5f1bc435cd55bcda8dea3e8bfae0dcb558ce35c4b875e0a8f5cbe6c462170e73adb7d967a8d8e790b57abaae8ad094e13e95119a663c4df13ec5951e8fcdd379d5c36c1c6b7fe5ae45a256544e726d0fef31e03d2fc5f18372a12a18397ee0f74c57e2b147ae61d27a799717bb06eafc4f66f8dcac81f7fb8273ef79b275babd63d36796c367bbbd6337b8cf12479d77fc56f82cd5f93f1853df5e15fc49338efb3f705c0ea0adb8f54119d7cd93ff1e2eaee3b797c1d3093c1ce30cd3f5461efb40d2ebf8dd9e5651d73154a70bf4eb66d02fea5a94f6299e322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb67c6df8a126b16ea1584308ed3bd0fe17a063dff05d7a65e5a351c977b1d8ed69c56786dae813a5fab1a667ba52bd707e7deef10772e19d6f34a9e4b8a570fedc1b520aedf7377783c1d115a50b939b1d8c575fce4351e5ec76ff7742d4468cad55f718d1535c5fedae6f1e0da687d70eebd255938ce78dc3b149717140ffb5207f8a88cbf8fe638cff85de2dfd743f170fdfa51a76d43c075ee0b79ce7183d6e669adbe3da2ad54e7c330f67dd495f11e0ebc77e4b188f7692bb54e4dfab13ccb2e5f5cf7a567c0d1f9ed8d88bd0e58138add86b133ce280ef96ba0fca5aae1ba548ff420ad89ddf6117a2618b2fb9f6bf33e97833a3d11edef0b926d7fafc7d3eb31dbdcf904e4d963f0fdcf3526f5c468b41c34a23a781dc4754f9e3f46faf737e27d7b93bc3a78cd4275be026354dcfda351f71cae616a5fdc3d87140faf8d3b81d16fa37f9f67a5dfa7f5388c1749dfa7f538e410dea71578c75f01c727ae4941fc770bd5f99e777cff9a9c3e83f781519d1fc278d1e0ee59ac0fcebdfec67ba6c6e3efabb8fba4291e5ed760dffe736dc7be99f4f713e604b2603e519d5f79e7ac3b867b75c4679f8cf92c69d5e2caf8f78baf9fd5a1073ed397880ec53edfebb585f2ba07da4275fecbbb064cfebaa5780d987c5b475e93d038d011d156aaf3dfd0d7fe00d778749e70bcaaab3ef77dda4a5d03927eb6cde3fd7c608c2de1f9c0b5d5c375fde7fc92d6e53e1fb8cbfb9cc4e703ff2fe4591ddc87ce3556af8bd16805684475f0b741f43d82cff28dfa8ee1bab73fee3b26ea199438b637548f3f9b3faf16758d4075e8b3788d30cb3137389dfdbafe7c217d5f2679df30fe56a215e2e26f255a99f4cc836e7db08fd705e733769e2976dc33a7f3e3103bee99d3e311bbd18bdd388eb15573d55c92e60ccf440e7f7f86cf2cb55ba9eb5262c8c1e7aa52c0589d02c69a1430d6a680b12e058c9352c03839058c5352c03835058c59603c9fdfed0cfa14c6aa0fd7f92a75ad81b15b98b428e7ffef60febf544a5efb606c86bfe9422d5a82d16b817fe7713cfba1dcffeb8518f0ff2e989102c69929609c9502c6a61430ce4e01e39c1430ce4d01e3bc1430ce4f01e38214302e4c01e3a214302e4e01e392143036a780f18214305e9802c68b52c078710a182f4901e352654c8471252f6361ac8c9687e3fffc7b3affe718034f3eea9e53a6df9e94fdffad313f9fb46daccf8dc37b4b78ff4fb8a7f76c3b8e7b47ca7db65da9ff6f9589b1305646aefbd8f1773ca3e1c1df4546fdb68681b1305646aedfbfe06ff446c3d3059a754668c6c058182b23d7bd72e5decb89bf4deb8ad08c81b1305646aedf3c648391f737ff391efc1d447784660c8c85b13272dd979c8518a3e1e901cdd64468c6c058182b23d36fdb42cd7acae0c1df80f54468c6c058182ba3e559cba4596f193c6b41b3de08cd2431224fd2cfc9ee8d88c5f19bc172db4e0cc83825058c5353c088f749708c5fa5ee93e8e5d5a730567db8ce57a9fb243036c3ef63422df0f7107f4e8bf5bc3c25ef93c0d81b98b4c0dfabfc392d36000fc7ef67b21063343cc49083cfcd4801e3cc1430ce4a0163530a1867a780714e0a18e7a680715e0a18e7a78071410a1817a68071510a1817a78071490a18f16f55866bc5927fbf6c98e0b1e3fe5699e8b1e3fe2e99e8b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cd7349b1d330c7af8c138f11799a93e3c963db31569f80b6f745f06498da8eb13609683b31a48d71630a18d7a68051752cde83381646cbb399896753193c9b81670b13cfe63278b600cfd6e479c29cda52060f31e4e0736b53c0b831058caaa3ea28895175ac1c1d955119955119cf07631ac670654c453e16c6ca6879b625cf136ab6b50c9e6da0197dae8d97b1305646cbb33d799e50b36d65f06c07cdb64568c6c058182ba3e5d9913c4fa8d9f63278768066db233463602c8c95d1f2ec4c9e27d46c47193c3b41b31d119a313016c6ca68797625cf136ab6b30c9e5da0d9ce08cd18180b6365b43cbb93e70935db5506cf6ed06c5784660c8c85b1325a9e3dc9f3849aed2e83670f68b63b423306c6c258192dcfdee47942cdf694c1b31734db13a119036361ac8c96675ff23ca1667bcbe0d9079aed8dd04c2ae3da14306e4c0123b38e85b1325a9efd4c3cfbcae0d90f3c9732f1ec2f83e752e0b92c799e30a72e2d83871872f0b9b52960dc980246d5517594c4a83a568e8ecaa88cca581e635f0a18f55c2ba3544686bfaf4afe86e6d2091ebbc18bdd5021b1e37e4333d1636b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae792621f483e76a1dc67cc1c001e8e67de30b5336f8f7bb93bd61f13d4cf6a7585a7d5a59e5639a87339e87705837e19884bc7a67d8a572ef333043033c52e4c33c79802eda7181b3d3d6cfc2b99da1e37d65f39c163c78df5133d76dc583fd1636b9e6b9e57426ccd73cdf34a88ad79ae792e2536966b83e1eb767afea93dc633e1fd8cc76ab71aa873d9a4e26b43a07d8823b6f621fdaea884d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9bc3cc77ca81a079ec0e3094af06c10c6b35b18cf0e613c6b84f12c16c6d3298c67ae309e82309e19c278b60ae399228c67b9309e6a613c9b84f1e485f1ec15c6b34418cf0a613cf384f1cc14c63355184f8d309ecdc278560be3d9278c678f309e5e613c4b85f1f408e3d9268ca74b18cf7c613cedc2786609e359298c272b8ca755184fad309e9dc2785a84f12c13c6b35f18cf3a613c0b84f13409e3a917c69313c653278c67bd309e5dc278b60be3e916c6b350184f87309ed9c2785609e399268ca74118cf16613c9384f12c12c6334718cf74613c8dc278260be3198fe70d95c39311c0930dce7d265916de3f00be2aefb376bc6a6b1a7eff2ae7af82cf5cedcad511c7be0a7cf4dbf0ab233e8b3a5d056de973e5fcd3db429d30561fec53bc7ae0b85a08cf01613c9385f1340ae3992e8c678e309e45c2782609e3d9228ca74118cf34613cab84f1cc16c6d3218c67a1309e6e613cdb85f1ec12c6b35e184f9d309e9c309e7a613c4dc2781608e359278c67bf309e65c2785a84f1ec14c6532b8ca755184f5618cf4a613cb384f1b40be3992f8ca74b18cf36613c3dc278960ae3e915c6b34718cf3e613cab85f16c16c653238c67aa309e99c278e609e359218c6789309ebdc278f2c2783609e3a916c6b35c18cf14613c5b85f1cc10c65310c63357184fa7309ec5c278d608e3d9218c67b7309e0dc278aa227818feffcb9087ee5fa363d3fe0121b119ce43f8ff7e5ec3d4a66bddb1eadc71899fe2d5409debdc8581bd1f053f4b5cfefd8678efdcb5a0d1b54c6da1f391f1ce0f73ec02de57190043e0e91344f070dc8fcad4ce117998e0ff3f9bb75a5de769e59fbb1cd4b906f4bb8e41bfa8dcfe531f70af6964b63cf4dd41ac59a8b7410823f9aee4e509fbed8660e456aadf5e073c1c6318533bc3fe75bdd7a60d11ba531dccd5eb19da19d57768ff7a380f6963b63c9b5c9958b3506f931046f25dcbcb13f6af4dc1c8ad54ffba1e7838c61fa67686fdeb06af4d9b2274a73a98ab3730b433aaefd0fe0d701ed2c66c7936bb32b166a1de66218ce4bb8e97a7230b6da6ad54ffba017838c61fa67686fdeb46af4d9b2374a73a98ab3732b433aaefd0fe8d701e945999a3982d0ffdc68458b3506f8b1046f25dcfcad391cf429b692b358edd083c1ce33c93eee1387693d7a62d11ba531dccd59b18da19d57768ffa688d8cd41b25adc3c0a2d6e8ee0b9799cb5a078e5325f934266d559758e63569d55e73866d559758e63569d55e73866d559758e63569d5567bba9ceaab3eaac3a27c1ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc72c4167cb43cf8821d62cd4db2a84917c37f0f284bf0bda1a8cdc32de7e1f946f069e1b19f4616a67780ff941af4d5b2374a73ad8bf0e32b433aaefd0fe41380f07cb60be2985ccaaf3d8982d0f3d2b9658b3506f9b1046f2ddc8cb138e63db82915ba971ec20f0708cf34ced0cc7b17eaf4ddb2274a73ad8bffa19da19d577689fe229b332c7315b1efa3f6c88350bf5b60b6124dfcdac3c85f0f78ddb83915ba971ac1f780e26ce531cc718740fc7b1435e9bb647e84e7530570f31b433aaefd0fe21380fe530df944266d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d2b4767cb43ff7708b166a1de0e218ce43bc8cad31eae3bec08466e196fbf0fca8780a73f719ee2ba0383eee1bac361af4d3b2274a73ad8bf0e33b433aaefd0fe61380f139df9a614326b6e8c0fb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb384dcb03c3b5d9958b3506fa71046f2f5f3f284cf3dd8198cdc4addb77318780e31e8c3d4cef0be9d235e9b7646e84e75b07f1d61686754dfa1fd23701e945999a3982dcf2e5726d62cd4db2584917c877879c2716c5730722b358e1d011e8e719ea99de13836e0b5695784ee5407737580a19d517d87f607e03c28b33247315b9eddae4cac59a8b75b0823f90ef3f284e3d8ee60e4566a1c1b001e8e719ea99de13876d46bd3ee08dda90ee6ea51867646f51dda3f0ae7419995398ad9f2ec716562cd42bd3d4218c9778497a7908536d3566a1c3b0a3c1ce33c533bc371ec16af4d7b2274a73a98abb730b433aaefd0fe2d701ed2c66c79f6ba32b166a1de5e218ce41be0e509fbd7de60e456aa7fdd023c1ce30f533bc3fe75cc6bd3de08dda90ee6ea31867646f51dda3f06e7216dcc96679f2b136b16eaed13c248bea3bc3c61ffda178cdc4af5af63c0c331fe30b533ec5fc7bd36ed8bd09dea60ae1e67686754dfa1fde3701ed2c66c79f6bb32b166a1de7e218ce4c3ef8bfd4c3c398f2717a1c5448cdde0c56ea890d88d5eecc60a89ad79ae795e09b135cf35cf2b21b6e6b9e67925c4aed45c53cd2b53f3cc79d43c731e35cfa8e62235ff6372b13b715ca98258c798da895b1f94717e8eb635c278160be3e914c63357184f4118cf0c613c5384f12c17c6532d8c272f8c6789309e15c278e609e399298c67aa309e1a613cab85f1f40ae3592a8ca747184f97309ef9c278da85f1cc12c6b352184f56184fab309e5a613c2dc2789609e359278c6781309e26613cf5c27872c2780e08e3a913c6b35e184fb7309e85c2783a84f1cc16c6b34a18cf34613c0dc2782609e359248c678e309ee9c2781a85f14c16c69311c0930dcefd3d0afe9ea01a7c747fff7ef03dcb950f80af2a22061de738f868fe948e61c79b754de73254c1676e8de07a56443c8a736bc467c743778cd507fb14af1e386e15c23359184fa3309ee9c278e608e359248c6792309e06613cd384f1ac12c6335b184f87309e85c278ba85f1ac17c653278ce780309e9c309e7a613c4dc2781608e359278c6799309e16613cb5c2785a85f16485f1ac14c6334b184fbb309ef9c278ba84f1f408e3592a8ca75718cf6a613c35c278a60ae399298c679e309e15c2789608e3c90be3a916c6b35c18cf14613c3384f11484f1cc15c6d3298c67b1309e35c278aa22780e30f1c43d4fe18080d8763f0fbad82d0bef8fc7ef000f788cb47f0c18919778f24c3c71cfa0c80b886ddb4f7f4bd01a5c16dec7df7171e554de63a4fda89cc2fbd25633f1c43db763b580d8560b9abba47b00b2f03efe6e812ba7567b8cb41f95538dbc3ce1ff2dd1128cdc4add6b847d8ee31c32b5338ffd2fc16768443e8bbac5d30a9fa13a1ef7c9c78d07144f9995398ed9f2d0da05b1e2f7d978fcee6d348c51dfaf0c3ce1f8d81a8cdc4a8d8fc78087e3fb83a99de13876c26b536b84ee540773f504433ba3fa0eed9f8888dd1c24abc5c95168713282e7e4386b41f1ca653e904266093a5b9e55ae4cac59a8b74a0823f9f2bc3ce1f8b82a18b9951a1f4f020fc7f707533bc331e194d7a65511ba531dec5fa718da19d57768ff149c8772984fa49059751e1bb3e5a1396462cd42bd821046f21d63e529e4b3d066da4a8d63a78087639c67d23d1cc706bd36152274a73ad8bf0619da19d577687f10ce83322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb66b63cf4db4662cd42bd76218ce43bc9ca535c77680f466ea5d61d068187635d8649f770dde1b4d7a6f608dda90ee6ea69867646f51dda3f0de7419995599995599995599995599995599995599995599995599995599995599965335b1e7ae636b166a15e871046f29de2e5097fb7d5118cdc4aad3b9c061e8e7519a67686eb0eb7796dea88d09dea60aedec6d0cea8be43fbb7c1795066658e62b63cf46c2b62cd42bd4e218ce41b64e529ae9f760623b752e3d86dc0c331ce33e91e8e6367bc367546e84e753057cf30b433aaefd0fe19380fe5309f4821b3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abce95a3b3e5a1ff738d58b350af4b0823f94eb3f2b487eb0e5dc1c8add4bac319e0e1589761d23d5c7738ebb5a92b4277aa83fdeb2c433ba3fa0eed9f85f330d1994fa4905973637c98353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e39825e486e5e9766562cd42bd6e218ce4bb8d97277cee417730722b75dfce59e039c3a00f533bc3fb7686bc367547e84e75b07f0d31b433aaefd0fe109c076556e62866cbb3c69589350bf5d6086124df195e9e4216da4c5ba9716c087838c679a67686e3d8ed5e9bd644e84e7530576f67686754dfa1fddbe13ca48dd9f2f4b832b166a15e8f1046f2e1f7720f134fcee3c9456871be62dbfd5e57ae77af5978bf1718b9c6c31e8f91f631c79197787a99781a3c9e86082dce576cdbfe75ae3ccdbd66e1fd75c0c89553bd1e23ed47e55403f0ac63e269f4781a23b4385fb1ad16eb5d79ba7bcdc2fbeb81912ba7d6798cb41f95538dc0b39e89276e4c5a3f0eb1e3fad778c48ecb95f188ad9aabe6aab96acea979e63c6a9e398f9a675473519a335c4785f3bd14230006dcfaa08c7f2b705c7b32b5331ff5f7d87aaf4df8f718ce399cafbf37945999e39899e62d3ab25e6cd227f078681b62d6623ce74d7bbd36a561deb414f3891432abce6363b6b1ef483e7647d68b4dfa041e0f6d77306bc1d4ce703cb83388d698e2e5a00ee6e99d0cedcc405c3a36eddf09e7a11ce6132964569dc7c66c63df9578ece2f3e43136e913783cb4ddc5ac054f3b8be3c1dd41b4c6142f0775304fef66686706e2d2b169ff6e380fcaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccca2c9bd9c67e76e2b18bf3f7189bf4093c1eda9ecdac054f3b8bf3f7f704d11a53bc1cd4c1737e0f433b3310978e4dfbf7c0795066655666655666655666655666655666655666655666655666655666655666d9cc36f673928f1dfe1e0763933e81c743db7398b5606a67387f7f6f10ad31c5cb411d3ce7f732b4330371e9d8b47f2f9c076556e628661bfbb989c72eaee7616cd227f078687b2eb3163ced2c8e07f705d11a53bc1cd4c1737e1f433b3310978e4dfbf7c1792887f9440a995567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975ae1c9d6decfb138fdd1ecedf636cd227f07868bb9f590b9e7616e7ef1f08a235a67839a88379fa00433b3310978e4dfb14af12984fa4905973637c98353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e39825e4868dfdbce46387bf67c7d8a44fe0f1d0f63c662d98da19defff26010ad31c5cb411dccd30719da9981b8746cda7f10ce83322b7314b38dfd50f2b10b592f36e913783cb43dc4ac05533bc3f1e0e1205a638a97833a78ce1f66686706e2d2b169ff61380f6963c6f397492e7678df26c5a872afd6f77c57ae06df0b5cb9067c2f74e55af0bdc895ebc0f762579e04be9740dbc8f752575e09be97b9f27af0bddc95d781ef15aedc0bbe57ba720ff85ee5ca43e07bb52bdf0ebed7b8f21de07bad2bdf09bed7b9f25de07bbd2bdf0dbe37b8f2b3c1f74657be077c6f72e5e780efcdae7c2ff8dee2cacf05df5b5df93ef0bdcd95ef07dfdb5df901f0bdc3959782ef9108df3b5df979e07b972b3f08be77bbf201f0bdc795a780efbdae3c157c7f01657a7d9f2bd783ef5157ce81effdae3c0d7c1f70e506f07dd095a783ef43aedc08be0fbbf20cf07dc4956782efa3ae3c0b7c1f73e526f07ddc956783ef13ae3c077c9f74e5b9e0fb942bcf03dfa75d793ef83ee3ca0bc0f759575e08becfb9f222f07dde951783ef0baebc047c5f74653cbf7fe9ca0f818fc69587c147e3caf3c147e3ca0bc047e3ca0bc147e3ca8bc047e3ca8bc147e3ca4bc04779f752f051debd0c7c94772f071fe5dd2bc04779f74af051debd0a7c9477af061fe5dd6bc04779f75af051debd0e7c9477af071fe5dd1bc04779f746f051debd097c94776f061fe5dd5bc04779f756f051debd0d7c94776f071fe5dd3bc04779f708f828efde093ecabb7781afd995df0dbe0b5cf93de0bbd095df0bbe8b5c19c7998b5df97de0bbc4951f051f8d85ef07df335cf903e05be6ca1f04df7257fe10f856b8f287c1b7d2953f02be55aefc51f0b5b8f2c7c0d7eaca1f07df6a57fe04f8f2aefc49f0b5b9f2a7c05770e54f83afdd953f03be0e57fe2cf83a5df973e0eb72e5cf83afdb95bf00be35aefc45f0d1f7388d33b63fdb7e493a9046d6476d6e8d680bf926435bfa8264afe928161d9bf6db8191ce4161fc190ba3656cf3182d4f2783669857b495fa9ba913783a187898da19fecdd4e5b5a9dd6b530eea3c03dad9c5d0ce0cc4a563d37e17c4e638e7a8459d3bee324f8b1aa853ebbed0ecf769291de918367f0b116de9616e0b1d9bc6a59e7188ddedc5ce7bb1713ca6ad54ffea06e6350cccf6b8bdc91f37ec5f6bddb128a7284e1edab40e3448aa4d183be38ce290bf06caf39b86eb523dd283bebf88dde6329d4b64f73fd7e97d2e07757a22dadf1724dbfe5e8fa7d763b6d7f40d4dc31c0cfd21cc811e8f83f6f3a05d6f8c763da01dd5c1efbf1626edd6783cb4df023c748dd3053eba56207ebcce6a1d076e7fdceb8ae0265f3730b644301692670caf755a3c46da2f0023f9d6004f379366feb95ee6e983dfcb93bc3af4d91aa8b31abe1bb311756dbf5b9a196e17fd0dfec720d931bd8e412f9c1f08409fc0d3903662981c0ccf2124c93335189e23383b3478a6ff9681cb07fa8f6400adc6c3c4d74c4433aac087e5ea085f108c9c0ac129599a0ac129d92a4f169c82a1faf64f29db2c9a6e1838797ce899a7064e1d3e73f7e9a181237b076f41ea5a8f1e49e35a80a4e8a36d72303c69d31724bb1853e7c52a953c93e17512bc4f75f24f6f6b636a67f8a537c56b539dd7a61cd4a985f7a630b4330371e9d8b43f252276820351a8c5d4516831358267ea386b8113dfe4c39e4aefe3e24995d716ecd1d8263fcf136d10055c0ac7cf3838fb9eedecb5ae319382e1934da3a7bda2b527c1ce98da6f2d3b236a6740ed10646738ed8ca6fd52b333967686d2ce48da19483be3686718ed8ca29d41b433867686b03928ce00da193f3bc36767f42e01b6af02affdabda7e43da19393b036767dcec9595bd02b05723f6eadb5e29dad90f7b8560ffb2b4b30cf6dbd65ec9d86f69fbcd6aaf14ed15a2bda2b757b876956a83b18d4eeb4dc6361bdb626cabb16dc6b61bdb616ca7b15dc6761bdb636cafb17dc6f61bbbd4d865417176fd72635718bbd2d8338d5d65ec6a63d718bbd6d875c6ae377683b11b8ddd64ec6663078df51b3b64ecb0b123c6068c1d35768bb163c68e1b7b96b15b83e21d3a278d9d323668ecb4b1db8c9d31763628ae98d91532bb226657c0ec8a975de1b22b5a7605cbae58d9152abb226557a0ee0f8a2b4c76a5c8ae0cd95501bb0a6067fded2cff0b83e22cbe9db57f49509c95b7b3f076d6ddceb2db59753b8b6e67cded2cb99d15b7b3e076d6dbce72db596d3b8b6d67aded2cb59d95b6b3d076d6d9ce323f12146791edacb19d25b6b3c27616d8cefada59de4783e22cae9db5b5b3b47656d6cec2da59573bcb6a6755ed2caa9d35b5b3a47656d4ce82da594f3bcb696735ed2ca69db5b4b3947656f24bc61e33f657c6fedad8df18fb5b637f67ecef8d7dd9d8578cfd83b17f34f64f41312fffd9d8bf18fb9ab17f35f66fc6be6eecdf8d7dc3d8378dfd87b16f197bdcd8b78d7dc7d8778d7dcfd8f78dfdc0d80f8dfdc8d87f1afbb1b19f18fba9b19f19fbb9b15f18fba5b15f19fbb5b1278c3d69ec37c67e6bec77c67e6feca96078750307913fb81d9a69ef1f1a1a38797aa87968b0f9e4ed27868e9f3e7177f39dc7878e350fde3170e6e889c13bf1c3ef73c3162d236c3a73a6ffeee6e3a78e0cdcd53c78fb50f3e0d1e64383b79f3a72163ff465f7a185e746ec3f72243ed8b7aa9e06e977c718f497ee73b440b3ab74db9e188b204f8de54333abc7d6a04bddb70efdf57e45f16ab7f9ec89c1a1e67cf329f36fff09f3998123adcdf8de5923f2d9a1e6b343fd67869a8f9e193cd9dcd68ac7bd76ca181a51d334860fb5368dbee5c1ff03c304b133250a0400", + "packedBytecode": "0x000000028df71de500000047d11f8b08000000000000ffed9d779815c5baee7b6008b26644ccd9c1848ae2b0c8cc008339614611116118465060886246dd067230672428390b2828490c3be7e40eea76bbd33967effddc3fce3de706efed5aabbe3def94d58b5963d7e25db3aa9fa766557f53dddfafdefeba3a5577fd330882a2203db50cd3e9c1d727f97f95fe2dff6653d718d755ee92b3284f385be40967cb3ce12cce13ce5679c2d93a4f38dbe40967db3ce13c24464ec5d6226838c5cddbce81ae713326f24cd3923cd0b434cf343d340f346d1fe4471b75589e7076c813cec3f384f3883ce13c324f388fca13cea3f384f3983ce13c364f388fcb13cee3f384f3843ce13c314f384fca13ce93f384f3943ce12ccb13ce8e79c2796a9e709e96279ca7e709e71979c279668c9c9d81b393fe3d4bff9ead7fcfd1bf52f65cfd7b9efeeda2eb58ace7cf575c61520f6992c6ffba85a97b987a84a9a7f1bf5e61ea1da63e61eaabff57a6ff5711a6ca30f50b53ff300dd01a0c0cd30561ba304c1785e9e2305d12a64bc37459982e0fd31561ba324c5785695098ae0ed33561ba364cd785e9fa30dd10a61bc334384c3785e9e6300d09d32d611a6ab0dc1aa66161ba2d4cc3c3747b984684696498aac3342a4c35611a1da6da30dd11a631611a1ba63bc3745798c685697c982684a92e4c13c334294c93c334254c53c3342d4c7787697a98ee09d3bd61bacfd0ecfe303d10a607c3f490c139234c0f87e991303d1aa66f85e9b1303d1ea627c2f4649866866956986687694e98e686695e98e68769419816866951989e0ad3d3617a264ccf86e9b9303d1fa617c2f462985e0ad3cb617a254caf86e935cd223bc2e230bd1ea625615a1aa665615a1ea637c2f4669856846965985685697598d684696d98d685697d9836846963983685697398b684e9ad306d0dd3b6306d0fd3db617a274c3bc2b4334cef86e9bd30ed0ad3ee30ed09d3de30ed0bd3fb61da1fa60fc2f461983e0ad3c761fa7698be13a6ef86e97b61fa7e987e6068fec330fd284c3f0ed34fb4eda7faf767baacdcbffb79987ea1f3bfd4bfbfd2bfbfd6bf9f18cbfc264cbf356cbf0bd3ef0ddba761fa4ce73fd7bf7fd0bf5fe8df3feadf2ff5ef9ff4ef9ff5ef5ff4ef5ff5efdff4efbfe9df7fd7bfffa17fffae7fffa17fff19a62d1dd3f9b641fd5415c4d44675af4d3dfb11f13b050d27a5454bfd3ff92dd3f6623d2fbfa25d2b3ddfcab0b7d6f3ad8df5b4d5f36d0d7b073ddfc1b01fa1e78f30ec47e9f9a30cfb317afe18c37eba9e3f1dec8900ee0d6bbbb2b5d4a622b049bcb6005b2b6d6b09b6d6b23ab0b5d1b6566093eddb1a6c87685b1bb0b5d3b6b6604b68db21a265984ab4ad2a882b56ca47aaf596c6bd5efdbcecd0f87947a9f5b677c47b58fcbca3d57a3b38e055f171b85ed761103747685b07b01da96d8783ed286d3b026c476bdb91603b46db8e02dbb1da7634d88ed3b663c076bcb61d0bb613b4ed38b09da86dc783ed246d3b016c276bdb89603b45db4e025b99b69d0c36dde406a780ed546d2b03db69dad6116ca76bdba9603b43db4e03db99da763ad8a4fd3d036c72be78a6b6a9b6e390225846dba5dd4a2d236d36d8ce96f61a6ce7485b0db6ced24e83ed5cf02db6f3a0ad115b176d93764bfdafafce570571ed27c95ab5de8ab8d71bae59adb75ffceb4d3d73ec1fd4eb5a057e2a40ab013a1f63bfa6aee8bb4827f123f662c85f0165a59ce821c71e6157c7984a9d1f9061b9bec672a550a6d252ffaa20defaf73378fa19ccad20ef2666bb75f331dbe829eb981d0265cdd893f3a0e618b38380c341ccf6f231dbe829eb98ad85b266ecc9b970738cd95b81c341cc56bb89d964b98fd9f47db320b0c79e5c0f35c7981d0b1cf1c76c0f1fb38d9fb28ed947a1ac197b724ddc1c63763a70c41fb3bdaafdb941a3a7ac6376219435634feecf34c7987d1c381cc46cad6f671b3d651db3af415933f6e45e61738cd9a78123fe98ede32866bbf9980dd2cf4083c01e7b72dfba39c6ec12e0883f6647f9fbb38d9fb28ed91d50d68c3d7986d21c637683ceabe70c3fd5cf194e04dbcfb4ed24e08d3fb66b7a388aeda48fed74df9020b0c7a83ccf6b8eb1bd5be7551cff12fa2388ed57dad6116cbfd6b653c1f689b69d06f572b00f54fb7da0d153d6fbc06fa1ac19cbf26cb939ee033f060e07315be363b6d153d631fb37286bc69ef473688e31fb29703888d95a1fb38d9eb28ed9ff82b266ec9da5f3cd3166a5afa93a5ff85c9f2f9c03b63f685b67b07da16de782ed8fda761ed8bed4b62e60fb93b69d0fb63f6b5b39d8fea26d5dc1f6576d4b82ed6fdad60d6cffa66dddc1f6efdad6036cffa16d3dc1f6776deb05b67f685b6fb0fd53dbfa689b7ade257dafe4bcb52df05705f16e5be97729eb96f9ae39f0dddef0dd3e87be3b18be3b587c271df84e800f998a8cf92ac827ddf29497020ffaea1ebfaf6eaaeedd82c6d7bd3bf0f47050f704f8680c4f0fe0e9193f4faaff6faff8d79bdac6dd0c4d13e0ab1bd4abb7837a15812f59b7cc8bbf52b061dbdadbc2d8277ec66411f89275cb7c1f60141bb6f5f2ce95ec3fea78d8a9a89ed7c1be943a27427f55c021fe8aa1cce51debcb76d66c25f07f3ceef5346c8ee2321517e24bd62df3e2af04ead333f78cc9c632f630185db51145e04bd6ed7dd76f07c9e371dcc1b58eb54d13df1539f0ddc7f0ddddf08d6da74c998e6d7d8039f66b4e7d6cab8c7fbde5787d22d786e207cf1ff01a2eae3aa16fb936143f622f86fcd545f565a59ce821edb0b0ab58966d89ece672bd8de54aa14c85a5fe5541bcf5af34782a0d6675bcb9108e850ef687540c54181c32df1db4ab8cd0ae02b49332678176aedab3be068fccf7041e69c77a018fab6ba2289e5c5c8f1dc8379ec3e2f5b3fc1fcf035c6dafae06a3ccdbb6571f60b49dab38b89ec978aed20318c5d61778ba39d22c6abb7623f1ed205652ed91f8907373d97fc55f3194e9d3b2beec9dd056ba88118c47991a7bcd1bff764aa6aec17b64c183dbcec175555747f1588ef76fbe0ae28d35b35dea616815758fc7555bdecde09179f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f199f2761bf2d29d79384d1ecffe6ea3e7feafb877a5df80ce87f3bed0f962cc7fe31d20fe21ca3cec550a6b4453ddbff83fe60e6732aec23d9d3ad76a96d89fd31ab605efc615f2bdc960cfd9dca62f39d1ce5ea799bfa0698fa8ea6d9f7b3a7455317fd9f51d3224353ec8f7faec1a3e2b4b2653d9b8b677fd93e8b44ad241fe7b3bdd2c01eebf16f97648367d62d8286ed071e675cf5df91b65a9e975718be8ba1cc092deab70df6b3aa823ac872d8ef47d62dcb9c03cb561aeb6eaf97158ed6c6fa7bc1b252e6646853f7b6a8d7cc415b99ccb6ef3a3e378fff389c7e8edf2d0b9eaec0e3a29d7174be518efb40dccff1cdfe69b6f31829837dfb1cf4abccd8df49fc7966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563ce6b3567cbfb63b09638efa3ea49e67c8b7caf0d9d48616f57e5d3f8793674e9d8d3ae3bba3ff6c51cfb645e74b82aff77788da96aebe4f11b52dc51f7e7b069f05b978ae5b04be64dd498b16922f8bcd77fa39be8bb121e4397e3743d7ee164d5dedaff88c1535c5fdb587c183cf46a3beed93346c2efb0e45c585f8c37d290936c9e3fbd12eb6331e4bcc7e3de20f9f5f7f576bdb3e70b5ed93e52edb0d79362fcfeabb59ea2a657e046ddf4f741efb7060df91cf2dff9729d3736ad14fd5d9c1f735cb8b605db27d6ddff61c08ac31f9ee8aeb2ad269a0a14131e43f6b515f56ca4959d15ad8d53e22df80417673b91ec672a550a6bfa5fe5541bcf537bfb53ac06056b1f37388b3cfe1f8efaa4dea1fa1d139a0919471fccd466bff4ab35f21b6a36d8c32b22c7e8beeafd04645f51fb51d035c1fc764ddb6e398795c684c3fcf42efa7f5dfd05ec4dd4febbf2186b09f5660acbf33ac5fb8da04d1c71629f37f8df59be7e4b20cf603fbd77e02df7349ea7c36e7e407ebfaca764e8ecb45d55d31e377d0aa6264c69840168c2729d34e6b2ddbac3282bb8f65d9d28865452bf35b6125c1d7f573f39db5f43e3fc0a88bc4357e835cca1c01757173de923e0774f54d395997b403494b5da5ccb1b0af1daff309d84ed8369f6df9bf4c99ce01710cf70be2af736afb5ea8d725dbf7028bef8b803526df5dd1b79c038a1fb11743feac96f565a59ce8215a0bbbda47e43c0ad9cde52a8ce54aa1cc404bfdab8278eb7f81c17381c1ac62e72488b3b3a11fbaabb67a6084469d41232983f7146ddf01b5ddeb70f5fe46d4b914bebf649e5fe171d2cd7993fd3cd6bcaf663b47e86cf0e339422f68671396b2e6fd42395ec6d96f18df95e8057ef15d0957df6eee0bba55c13c9e171c4cdf2ebe63abfc458d99d03707bea3c64cc885ef0e86ef0e39f4ed35f79a3369ee600c82d4fb67f8cd5235653a2fc5710964b916c0e8622c8744d0f0dbe30762c4f11d64b996c0e8e2f890edb7cf7b01a32c570c8c2ede2dc5f1371ac388df18c6e3bc303af8566cd7a67e2b16efe9b50646a67736f1d9541b6074715edcd477f5f07cbe2dfcba1a97a85b168c496094e50e014617f7c6f15aa6318c785d24cbb5034617cfb0b21ddf09bf3d8ff7965d32663ab63bee8b92ccf6de4ba55b9e8ce71ae8dbc1b886292df03ee381b4e8e79627e3b90ffa7670df2fa5058e3378202df0d9a08b710f1341c3e77007e2c1e797b2dce1c058e5887140168c55c0f8af7bc5c038d0116355168c038151ec4702a383fbaf29c6815930e27d4a59ee2860bcd011e30559305e088cb2dcd1c0e8e25e6a02fc3686f1226094e58e01c68b1d315e9405e3c5c028cb1d0b8c973862bc380bc64b8051963b0e182f75c47849168c9702a32c773c305ee688f1d22c182f034659ee0460bcdc11e36559305e0e8cb2dc89c0788523c6cbb360bc021865b99380f14a478c5764c1782530ca722703e3558e18afcc82f12a6094e54e01c6418e18afca82711030ca7265c078b523c64159305e0d8cb25c4760bcc611e3d559305e038cb2dca9c078ad23c66bb260bc161865b9d380f13a478cd766c1781d30ca72a703e3f58e18afcb82f17a6094e5ce00c61b1c315e9f05e30dc028cb9d098c373a62bc210bc61b81f1060be360478c3766c138181865b97381f1a6f81953d7d283b360bc09786e8e9f27a5d94d59f0dcec9627f55dbd9b2cbe6e89df576a5b0c091a5ff75b806768fc3ca96d714b163cc2500acba166b7c6cf98d26c68168cb702cfb0f879529add9a05cf30d0ec568b66b7c5cf98d26c58168cb701cff0f879529add9605cf70d0ec368b66b7c7cf98d26c78168cb703cf88f879529add9e05cf88a05eb3db2d9a8d8c9f31a5d9882c1847024f75fc3c29cd4666c1530d9a8db468362a7ec69466d559308e029e9af879529a8dca82a706341b65d16c74fc8c29cd6ab2601c0d3cb5f1f3a4341b9d054f2d6836daa2d91df133a634abcd82f10ee019133f4f4ab33bb2e019039add61d16c6cfc8c29cdc664c1381678ee8c9f27a5d9d82c78ee04cdc65a34bbcb11e39d5930de65e189fb3bd9775a7c8d7754f77141e3eb2e0ca5b01cf69398e088717c168c13805196c37e12758e182764c158078cb25cc23163a67e1275e07b62fcbe53ed525dd0787d26bae5c9d84f027d4f72a4c5c4a0f15a4c72cb93b19f04fa9eec488b4941e3b5980c3c531c6891001f8de1118652580efb494c75c438250bc6a9c028cb613f89698e18a766c1380d186539ec2771b723c6695930de0d8cb21cf69398ee88f1ee2c18a703a32c87fd24ee71c4383d0bc67b805196c37e12f73a62bc270bc67b815196c37e12f73962bc370bc6fb805196c37e12f73b62bc2f0bc6fb815196c37e120f3862bc3f0bc607805196c37e120f3a627c200bc607815196c37e120f39627c300bc687805196c37e12331c313e9405e30c6094e5b09fc4c38e186764c1f83030ca72d84fe211478c0f67c1f80830ca72773966cc74fdf24833f71d75add2dc7d475d973477df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f771cee4fb5107be13e043a62263be0af2c2500acbdde5199b3523f294c5c7538e75475fdf22a8fbb72c3c458eea8ebe1e23a8bb30e41be3a379c088fbb8d7b1e98c8e754c369551f13cee88e7b12c781e079e271cf13c9e05cf13c0f364fc3ca9987a220b1e612885e5eeca03c647f380d1ebe8756462f43a168e8e9ed1337a46cf783018f3a10df78c79118fc9a6322a9e99f1f3a4347b320b9e99a0992c77b35bc664531915cfacf879529acdcc8267166836d3a29903c664531915cfecf879529acdca8267366836cba29903c664531915cf9cf879529acdce82670e6836dba29903c664531915cfdcf879529acdc982672e6836c7a29903c664531915cfbcf879529acdcd82671e6836d7a29903c664531915cffcf879529acdcb82673e6836cfa29903c664531915cf82f879529acdcf8267016836dfa29903c664531915cfc2f879529a2dc882672168b6c0a2192be35d79c0f8681e303ad631d95446c5b3c811cfc22c781601cf538e781665c1f314f03c1d3f4f2aa69eca8247184a61b9bbf280f1d13c60f43a7a1d9918bd8e85a3a367f48c9e313bc66fe501a3dfd69e9195d1c1f555c677689e6ae6bea3dea169eebea3dea169eebe7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee39cc9f733f1fb4e66fb8d996780c7c5376f1cd5b35cadf759bdaeaf62d44f69f59ca1d5538656a550e659d0ef3907fa15815f59b7cc8bbf6c993b11303bf29d3c345cc721507ff1f1a8a187f2ffbca3ba47b5f5cf3773df516d7d73f71dd5d63777df3ece7d9c17826f1fe73ece0bc1b78f731fe72cbe31df2aa83f6f97ef9faa75bc00ff2f82f2f25de1622833a54dfab77de0f72117befd3ee48f1585e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe77c718ef15099039ec0e00932f02c24e39946c633878c670c19cf30329e6bc8782e24e379808ca73b19cf44329e51643c3791f15c41c6733e194f7f329ee9643c7dc878e692f1dc49c6f30419cf70329eebc8782e26e379888c2749c633998c673419cf2d643c5791f15491f1dc4bc6d38b8ce76c329ef1643cf3c878ce22e31941c6f32419cf0d643c8792f1b427e3b9948ce731329ef3c8782ac8781e26e35940c633958ce70e329e5bc978cac978ae26e3e942c6730119cffd643c3dc878e693f1d491f1cc24e3a926e3194cc6730e19cfe5643c2dc978fa91f12c22e3b99b8ca72f19cf58329ece643cb791f15c4bc6731119cf83643cddc8782691f1cc22e3a921e31942c6732519cf00329e7bc8787a93f18c23e3e944c6733b19cff5643cb9f89e69363c25643ca5643c9790f13c42c633838ca72b19cf14329ed9643cb5643c43c9780691f10c24e3b98f8ca72719cf04329e91643c3792f13c4ec67318194f07329ecbc8788a087812c1d7c73049c0ff9f015b0b6359f5d9d7b91debffffa2b6b780655ed2f9969675bf0836f996ec4b966551a717a12e553a5ffecda6944ee8ab0ae6c55f0970bc44c27319194f07329ec3c8781e27e3b9918c672419cf04329e9e643cf791f10c24e31944c633948ca7968c673619cf14329eae643c33c8781e21e3b9848ca7948ca7848ce719329eebc9786e27e3e944c6338e8ca73719cf3d643c03c878ae24e31942c65343c6338b8c6712194f37329e07c9782e22e3b9968ce736329ece643c63c978fa92f1dc4dc6b3888ca71f194f4b329ecbc978ce21e3194cc6534dc633938ca78e8c673e194f0f329efbc9782e20e3e942c67335194f3919cfad643c7790f14c25e35940c6f330194f0519cf79643c8f91f15c4ac6d39e8ce750329e1bc8789e24e31941c6731619cf3c329ef1643c6793f1f422e3b9978ca78a8ce72a329e5bc8784693f14c26e34992f13c44c6733119cf75643cc3c9789e20e3b9938c672e194f1f329ee9643cfdc978ce27e3b9828ce726329e51643c13c978ba93f13c40c6732119cf35643cc3c878c690f1cc21e39946c6b3908ca7d2c2f38c231e79df5dd62df3cf90f876b01dcad57a5f7654a757f4ba5aebf50abff82b863233daa57fd5f30f5c56b8ccef13e0bb39af8046af38aa8b6c8f2263fba0ef171cf936c7e793f9179ab9eff686eff605e2bb83e1bb4381f8f671eee3bc107cfb38f7715e08be7d9cfb3867f2ede0da2089df4993a9c898af823c5e2fb8f8be9ca37a36b84efc2a46fd9456af1a5a99d756a550e665d0ef5507fad9ae3d655efc65cbdc898019e3a22c88372e5e8bbf4e49d5eff010d0f535435facd762479a461d43163773df51c790e6ee3bea18d2dc7dfb38f7715e08be7d9cfb382f04df3ece7d9c33f97e5de763bc6e2c471fad82faeb81d7c1ef529d2f8ad1af5ad712f05b041ce2af18cafc2f78aee9f779bfcfc7e5db1fdb7c9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8668e73332ffdc5cf023657fdf9a3623117ef121c4cdf51b1d8dc7d47c56273f7ede3dcc73993ef650e7c27c0874c99faf82d039e250e781cd533f56c63b951a7678c3a9542193cc62f7750cf22f02beb96f9e5c0235325f0b88883c66c73e45948c6338d8c670e19cf18329e61643cd790f15c48c6f300194f77329e89643ca3c8786e22e3b9828ce77c329efe643cd3c978fa90f1cc25e3b9938ce709329ee1643cd791f15c4cc6f310194f928c673219cf68329e5bc878ae22e3a922e3b9978ca71719cfd9643ce3c978e691f18c20e379928ce706329e43c978da93f15c4ac6f31819cf79643c15643c0f93f12c20e3994ac6730719cfad643ce5643c8bc978ae26e3e942c6730119cffd643c3dc878e693f1d491f1cc24e3a926e3194cc6730e19cfe5643c2dc978fa91f12c22e3b99b8ca72f19cf58329ece643cb791f15c4bc6731119cf83643cddc8782691f1cc22e3a921e31942c6f32a19cf95643c03c878ee21e3e94dc6338e8ca71319cfed643cd793f19490f19492f15c42c6f30819cf0c329eae643c53c8786693f1d492f10c25e31944c633908ce73e329e9e643c13c8784692f1dc48c6f33819cf61643c1dc8782e23e32922e049045f7ff73f01ff7f156cf28efa33607b43e79780ad85c5474b9d5f0eb6629d9775b409d3f31dbfbe6ed4c9d57bf9e8ab0ae6c55f0970bc41c27319194f07329ec3c8781e27e3b9918c672419cf04329e9e643cf791f10c24e31944c633948ca7968c673619cf14329eae643c33c8781e21e3b9848ca7948ca7848ce77a329edbc9783a91f18c23e3e94dc6730f19cf00329e2bc9785e25e31942c65343c6338b8c6712194f37329e07c9782e22e3b9968ce736329ece643c63c978fa92f1dc4dc6b3888ca71f194f4b329ecbc978ce21e3194cc6534dc633938ca78e8c673e194f0f329efbc9782e20e3e942c6733519cf62329e72329e5bc978ee20e3994ac6b3808ce761329e0a329ef3c8781e23e3b9948ca73d19cfa1643c3790f13c49c633828c671e19cf78329eb3c9787a91f1dc4bc65345c6731519cf2d643ca3c9782693f124c9781e22e3b9988ce73a329ee1643c4f90f1dc49c633978ca70f19cf74329efe643ce793f15c41c6731319cf28329e89643cddc9781e20e3b9908ce71a329e61643c63c878e690f14c23e35948c653991b9ea47ab75dfa5a07c0855315e49703cf6207fa38aa67397ed7e0ab18d7abb47ad3d0ea5543ab5228b30cf47bd3817e45e057d62df3e22f1f9915cf233a6ffb0ec423248c625bec9627b5df3e12349c32edb76f028f8b76cd513d53fbd70aa34e8f5874973218ab2b1cd4d3b6efc8fc0ad80ef9c6ac781ed379614d40b9c74818c5b6dc2d4f6aff7a2c683865dabf56008f8bf6c7513d53fbd74aa34e8f5974973218ab2b1dd4d3b6efc8fc4ad80ef9c6ac781ed779614d40b9c74918c5f6a65b9eee09a8b34c99f6af95c0e3a2fd7154cfd4feb5caa8d3e316dda50cc6ea2a07f5b4ed3b32bf0ab68367f6cc3666c523cf76843501e59e206114db0aa73cddcb1350679932b563ab80c7453bef48f7543bb6daa8d31316dda50cc6ea6a07f5b4ed3b32bfdae2bb2c88578b358dd0628d85674d8eb5107fd9322fcb4366afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866069d158f7cbb52581350ee491246b1ad74cb937a2fe8c9a0e15464cc57417e0df0ac72a08fa37aa6fa90af35eaf4a445772983fbd75a07f5b4ed3b32bf16b64336ccabf390d9ebdc3466c53353e7853501e56692308a6d955b9e543b36336838656ac7d6028f8b76de513d53edd83aa34e332dba4b19dcbfd639a8a76ddf91f975b01d3cb367b6312b9e593a2fac0928378b84516c6b9cf22453ef37ce0a1a4e99dab175c0e3a29d77a47baa1d5b6fd4699645772983b1bade413d6dfb8eccaf87ed900df3ea3c64f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce85a3b3e299adf3c29a8072b34918c5b6d6294fb7d47387d941c329d37387f5c0b32e769ef4730707baa79e3b6c30ea34dba2bb94c1fd6b83837adaf61d99df00dba1b933afce43661f1bb961f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503c73745e5813506e0e09a3d8d6b9e5497df7604ed070cad46f6703f0ac77a08fa37aa6faed6c34ea34c7a2bb94c1fd6ba3837adaf61d99df08dbc1337b661bb3e299abf3c29a8072734918c5b6de2d4faa1d9b1b349c32b5631b81c7453befa89ea9766c9351a7b916dda50cc6ea2607f5b4ed3b32bf09b68367f6cc3666c5334fe7853501e5e691308a6d835b9e543b362f6838656ac736018f8b76de513d53edd866a34ef32cba4b198cd5cd0eea69db77647e336c07cfec996dcc8a67bece0b6b02cacd276114db46b73cc904d459a64cedd866e071d1ce3baa67aa1ddb62d469be45772983b1bac5413d6dfb8ecc6f81ed906fcc8a6781ce0b6b02ca2d206114db26b73ca9fd6b41d070cab47f6d011e17ed8fa37aa6f6afb78c3a2db0e82e653056df72504fdbbe23f36fc176c83766c5b350e7853501e51692308a6db35b9ed4feb530683865dabfde021e17ed8fa37aa6f6afad469d165a74973218ab5b1dd4d3b6efc8fc56d80ef9c6ac7816e9bcb026a0dc221246b1e1f16291239e5283a7d4a2c5c1f2ade62b74be44ff26e0ff15c0e8aa3d5c6430ca3cc638f2bad6acbdc1d3ded0ec60fa56f5afd4f943f52f6eaf4a6064d85eed73a0590783a783a1d9c1f4adb4e8a7f387e95fdc5efd8091617b75001e07ed73f784c1a3a64ce71b5b1debe3a89ea9f38d6d815d773c0e49193c766f73504fdbb984cc6f83ede0993db38d59f10cd679614d40b9c1248c62c3eb94edf1f3744f183c6acad48e6d77ac8fa37aa6dab1b703bbeedb41772983b1fab6837a16815f59b7ccbf0ddb211be6d579c8ec756e1ab3e219a2f3c29a8072434818c5b60d78de899fa77bc2e05153a676ec1dc7fa38aa67aa1ddb11d8757f07749732b87fed7050cf22f02beb96f91db01db2615e9d87cc5ee7a6312b9ea13a2fac0928379484516c6f03cfced879d2e301218f9a32b5633b1debe3a69ee976ecddc0aefb4ed05dcae0fef5ae837a16815f59b7ccbf0bdbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219a6f3c29a8072c34818c5b60378de8b9d27fddc0179d494e9b9c37b8ef57153cff473875d815df7f740772983b1bacb413d8bc0afac5be677c176f0cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccdac7886ebbcb026a0dc701246b1bd0b3cbbe3e7e99e3078d494e9b9c36ec7fa38aa67eab9c39ec0aefb6ed05dca60acee7150cf22f02beb96f93db01df67866cf6c61563c23745e5813506e0409a3d87601cfded879d2cf4f91474d99dab1bd8ef57153cf743bb62fb0ebbe1774973218abfb1cd4b308fccaba657e1f6c876c9857e721b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec752e1c9d154fb5ce0b6b02ca5593308a6d0ff0bc1f3b4fb7f284c1a3a62263be0af2ef3bd6c74d3dd3cf1df60776dddf07dda50cee5ffb1dd4b308fccaba657e3f6c87e6cebc3a0f997d6ce486d9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a398196243f1d4e8bcb026a05c0d09a3d8f601cf07f1f3744f183c6a2a32e6ab20ff81637d1cd533d56fe7c3c0aefb07a0bb94c1fdeb4307f52c02bfb26e99ff10b68367f6cc3666c553abf3c29a8072b5248c62db0f3c1fc5cf934c183c6acad48e7de4581f47f54cb5631f0776dd3f02dda50cc6eac70eea59047e65dd32ff316c877c63563c63745e5813506e0c09a3d83e041e077197e229357864fe2302df6abe4ee74bf42f6eaf3a6064d85ea539d0acbdc1d3ded0ec60fa56f59fa8f387ea5fdc5e138191617bb5cf81661d0c9e0e866607d3b7d26292ce1fa67f717b4d024686edd521079a1dccf6f060eedb07334ebde6074ff3a283a879d141d4bcc86b4ea5b983e34b128f650130e05405f98f81e73bf1f3a4eecb7d9c05cf7780e7dbf1f3747554cf72b5deef027b5ceb555a7dcfd0ea6343ab5228830cdf73a05f11f89575cbbcf8f3cc9e398a19cf6d853501e53e226114dbb781c745bba1ea7e9e5e97acbf55983e39b2deaf8be72578afb8b55eaf7088bf622833a9ac9eedf79aad04fe2fdb4dd567bf6173f40e7357db733b99177f2541ceeedd66bc978c5ab878de94ed717fbf85e7abf878ca713f475ffb1cd53d9b677ffb2c3c31d6bd6bd473cfbdf1d73dd57e74d1eb92f5ab7df47f1ce954f3eeb8ef49fbd1c5a8733194195456cff69fd07ed8da0ad7fba69c939bfb668ba0be3d13ae326d379f097da5ed52ee03288f6d4e85fec5fdb302eaeaaa5d8cbac784eda2d976bbd4de7c2e69fa2e055d3e20d5ccf69c0275acb470571270633ce6723f9375db9e91551a3ab26986dbfa038b8efd2cdcfd08b819f7eb7e868e6c9a1d68bf1e6ce11e4cc0cdb85f0f367464d3ec40fbf5100bf710026ec6fd7a88a1239b6607daaf875ab887127033eed7430d1dd9343bd07e3dccc23d8c809b71bf1e66e8c8a6d981f6ebe116eee104dc8cfbf570434736cd0eb45f8fb0708f20e066dcaf47040d7564d3ec40fb75b585bb9a809b71bfae367464d3ec40fb758d85bb86809b71bfae317464d3ec40fb75ad85bb96809b71bfae357464d3ec40fbf5180bf718026ec6fdbab1fdf659f7eb3a0b771d0137e37e5d67e8c8a6d981f6eb8916ee8904dc8cfbf544434736cd0eb45f4fb2704f22e066dcaf27193ab26966dbaf1dbd4b98f5bb8d1f3ad5273dc6f48759f0bc0f3c2e62ca511c943beae792ea9bbad7d0ea43432b1cbb631fe8e7a02f4cc66f12883fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfcccf85d467cbe22e53e2061141b3e9372719f5fd5fd7cbd2e597fab300d3abadeefbed8fd26cb5187d67abdc221fe8aa1ccf1a7d4b35da7d94a82af6f371c8b1bb7e59ed8eb90de9666fccbbcf82b81faec051e07efe7a778f6193cfb2c5ae07ba7f1f84e8e72a371b25c7d1fef90a07e3bef31ea839aee8edd7f434d8b0c4d773bf69d081a6e4f61c0a90af2c8e3e2d9b0a37aa6da825d469d4c8d4ba14c27a8e72e07f52c02bfb26e99df053c32b5001e573118183c81451f992ac978a691f18c21e3399d8c671819cfb1643cd790f11c42c6732119cf03643cddc9782692f18c22e339858ce726329e23c878ae20e3399f8ca7988ca73f19cf74329e3e643c7792f19c49c6339c8ce75c329ee3c978ae23e34990f15c4cc6f310194f928c673219cf68329e8e643cb790f11c45c67315194f6b329e2a329e7bc9787a91f19c4dc6339e8ce72c329e11643c2792f1dc40c67328194f7b329e4bc9781e26e3a920e3398f8c672a19cf1d643ca791f1dc4ac6534ec6730c19cfd5643c5dc8782e20e3694bc6733f194f0f329e3a329e6a329e93c9780693f19c43c6733819cfe5643c2dc978fa91f1dc4dc6d3978c672c194f67329e33c8786e23e3398e8ce75a329e76643c1791f1ec25e379908ca71b19cf24329e1a329efd643c65643c43c8788e24e3b9928ca71519cf00329e7bc8787a93f18c23e3e944c6733b19cf09643cd793f19490f19492f15c42c633838ca72b19cf14329e5a329e53c9788692f11c4dc633888ca70d19cf40329efbc8787a92f14c20e31949c6731219cf8d643c8791f17420e3b98c8ca7888027117cfd5b4c09f8ff3eb0c93783de075b0bcbfae439b59457c7c5251dbfbeee169675efb630a04eef415daa74befc9b4d299dd05715cc8bbf12e0d84dc27319194f07329ec3c8786e24e339898c672419cf04329e9e643cf791f10c24e36943c633888ce768329ea1643ca792f1d492f14c21e3e94ac633838ce712329e52329e12329eebc9784e20e3b99d8ca71319cf38329ede643cf790f10c20e36945c6732519cf91643c43c878cac878f693f1d490f14c22e3e946c6f32019cf5e329e8bc878da91f15c4bc6731c19cf6d643c6790f17426e3194bc6d3978ce76e329e7e643c2dc9782e27e3399c8ce71c329ec1643c2793f15493f1d491f1f420e3b99f8ca72d19cf05643c5dc878ae26e339868ca79c8ce756329ed3c878ee20e3994ac6731e194f0519cfc3643c9792f1b427e339948ce706329e13c9784690f19c45c6339e8ce76c329e5e643cf792f15491f1b426e3b98a8ce728329e5bc8783a92f18c26e3994cc69324e379888ce762329e0419cf75643cc793f19c4bc6339c8ce74c329e3bc978fa90f14c27e3e94fc6534cc6733e19cf15643c4790f1dc44c6730a19cf28329e89643cddc9781e20e3b9908ce710329e6bc8788e25e31946c6733a19cf18329e69643c95643c2d0c1efcbf7a376cafcecbb7838ae1ff9375e7f2f67a5d52469e11ab7b15ef1a3655df9d8eeafb6e503f55c1fc4ea8afb0bf0b3cef3ae279cfe0317d9740be1234db61d814e33b8e1877188c32ff0e308a7e3b806787239e9d068fe9bb04f2fd40b3b70d9b62dcee88f16d8351e6b703a3e8f736f0bced88e71d83c7f45d02f9c1a0d936c3a618b73a62dc6630cafc566014fdb601cf36473cdb0d1ed37709e48780666f1936c5b8c511e35b06a3cc6f0146d1ef2de079cb11cf5683c7f45d02f9a1a0d966c3a618373962dc6c30cafc266014fd3603cf66473c5b0c1ed37709e48781661b0d9b62dce08871a3c128f31b8051f4db083c1b1df16c32784cdf25901f0e9aad376c8a719d23c6f506a3ccaf0346d16f3df0ac77c4b3c1e0317d97407e0468b6d6b029c6358e18d71a8c32bf061845bfb5c0b3d611cf3a83c7f45d02f96ad06cb561538cab1c31ae3618657e15308a7eab8167b5239e35068fe9bb04f235a0d94ac3a6185738625c6930cafc0a6014fd5602cf4a473cab0c1ed37709e46b41b3370d9b627cc311e39b06a3ccbf018ca2df9bc0f3a6239e15068fe9bb04f26340b3e5864d312e73c4b8dc6094f965c028fa2d079ee58e78de30784cdf2590af03cd961a36c5b8c411e3528351e69700a3e8b71478963ae25966f098be4b203f11347bddb029c6c58e185f3718657e31308a7eaf03cfeb8e7896183ca6ef12c84f02cd5e336c8af155478caf198c32ff2a308a7eaf01cf6b8e78161b3ca6ef12c8df0036e1ed0bb65774be0fd85ed6f9de607b49e77b81ed459def09b61774be07d89ed7f9ee607b4ee7bb81ed599d4f82ed199def0ab6a775be3fd89ed2f901605ba4f355605ba8f303c1b640e72f00db7c9dbf106cf374fe22b0cdd5f98bc13647e72f01db6c9dbf146cb374fe32b0cdd4f9cbc1f6a4ce5f01b62774fe4ab03daef35781ed319d1f04b66fe9fcd5607b54e7af01db233a7f2dd8eed2f9ebc076b3ce5f0fb60f75fe46b07da4f33781ed639dbf056cdfd6f95bc1f61d9dbf0d6cdfd5f9dbc1f63d9d1f09b6efebfc28b0fd40e74783ed873a7f07d87ea4f363c1f6639dbf136c3fd1f97160fba9ce8f07dbcf747e02d87eaef393c1f60b9d9f02b65feafc54b0fd4ae7a781edd73a7f37d83ed1f9e960fb8dcedf03b6dfeafcbd60fb9dcedf07b6dfebfcfd60fb54e71f00db673aff20d83ed7f987c0f6079d9f01b62f74fe61b0fd51e7a55d53edec9f74be2c88b79dfd32a89fcac0b7f85365feacf36d8c32b26c31943953772854cf38d4b74ca51d967659d9a41d7e056cd20ebf0c3669875f029bb4c32f824ddae117c026edf0f3609376f839b0493bfc2cd8a41d7e066cd20e3f0d3669879f025b95ce2f029bb4c30bc126edf002b0493b3c1f6cd20ecf039bb4c373c126edf01cb0493b3c1b6cd20ecf029bb4c333c126edf093609376f809b0493bfc38d8a41d7e0c6cd20e7f0b6cd20e3f0a3669871f019bb4c377814ddae19bc126fbcb976093b6f943b049dbfc11d8a46dfe186cd2367f1b6cd2367f076cd2367f176cd2367f0f6cd2367f1f6cd236ff006cd236ff106cd236ff086cd236ff186cd236ff046ce375fea76093b6f9676093b6f9e76093b6f9176093b6f9976093b6f9576093b6f9d76093b6f913b049dbfc1bb049dbfc5bb049dbfc3bb049dbfc7bb049dbfc29d8a46dfe0c6cd2367f0e36699bff00b687755edaeab6609367c56a2aff86138ec3d3027c094b55106fdb8f5315e4b1ee325592f1cc25e31943c6f30219cfe9643cc3c8788e25e339848ce735329e89643c8bc8789693f12c23e379958ce714329e8d643c1bc8788e20e379978c672719cff9643cc5643cb3c9789e23e339938c673819cfb9643cc793f124c8781690f12c25e35942c6f332194f47329ef5643cebc8788e22e3d941c6f30e194f6b329e2fc9786692f19c4dc6f30c19cf59643c23c8784e24e339948ca73d194f0519cf79643cf3c8785e27e3594cc6f32219cf69643c6bc978d690f19493f11c43c6f33619cf76329e2e643c6dc9789e20e3a923e3798a8ca79a8ce764329ec1643ce790f11c4ec6d3928ca71f19cfcd643c73c8789e27e3e94cc6730619cf6a329e55643c5f90f11c47c6b38d8c672b194f3b329ebd643c93c8781692f1d490f1bc42c6b39f8ca78c8c670819cf91643cadc8783e24e39945c6f32c19cf4a329e15643c2790f1bc45c6b3858ca7848ca7948c673e194f2d19cf4b643ca792f10c25e3399a8ca70d19cf93643c4f93f1bc49c6f30619cf49643c9bc9783691f11c46c6d3818c671719cf7b643c45043c09e008c026ff6f0936f90ecf7eb07daef37bc126dff0790d6c9fe9fcc3607bd0626b61e1138619609377653f079bdc9f79086cf2cec4676093f306f1afe65775fc3a7f0b5846fcb4b4f0a3bfcf2c5c92c7ed2dcb5405f16e6ff45515d8bf795764301e6c9ef7c8787691f17420e3398c8c671319cf66329e93c878de20e379938ce769329e27c978da90f11c4dc633948ce754329e97c8786ac978e693f19492f19490f16c21e3798b8ce704329e15643c2bc9789e25e39945c6f321194f2b329e23c9788690f19491f1ec27e379858ca7868c672119cf24329ebd643cedc878b692f16c23e3398e8ce70b329e55643cabc978ce20e3e94cc6f33c19cf1c329e9bc978fa91f1b424e3399c8ce71c329ec1643c2793f15493f13c45c65347c6f304194f5b329e2e643cdbc978de26e339868ca79c8c670d19cf5a329ed3c8785e24e3594cc6f33a19cf3c329ef3c8782ac878da93f11c4ac6732219cf08329eb3c8789e21e3399b8c672619cf97643cadc978de21e3d941c6731419cf3a329ef5643c1dc9785e26e35942c6b3948c6701194f828ce778329e73c9788693f19c49c6f31c19cf6c329e62329ef3c9787692f1bc4bc6730419cf06329e8d643ca790f1bc4ac6b38c8c673919cf22329e89643caf91f11c42c6732c19cf30329ed3c9785e20e31943c633978ca7928ca7858567bf231ef9568cac5be6f73773df3b0ddf3b0bc4f73b86ef770ac4f776c3f7f602f1bdd5f0bdb5407c6f317c6f2910df9b0cdf9b0ac4f706c3f78602f1bdcef0bdae407caf317caf2910dfab0cdfab0ac4f70ac3f78a02f1fd86e1fb8d02f1bdccf0bdac407c2f317c2f2910df8b0ddf8b0bc437f3f5b7fa4e98f455dea57f13f0ff0a607ccd11e37e8351e65f0346b1e1f7a82b1cf1445dbb5710f8565ac8bd2c79e69980ff5702a3ab98aa301865de16533b81a7d2114fd43d874a02df4a0b79175bfa5426e0ff38feb2ab98aa341865de1653ef004f3f473c51f74afa11f8565ac8bbcff2ce5f02fe8fe3adbb8aa97e06a3ccdb626a3bf00c76c413758f6730816fa5857c2b4cbe499380ffe3f88cae626ab0c128f3b698c2f1738738e289ba373584c0b7d242beb52bdfbc4cc0ff71fc26573135c46094795b4ce1f871431df144dd531b4ae05b6921cf82e51bed09f8ff3060741553430d4699b7c5148e7733cc114fd4bdc06104be9516c3755efa5825e0ffc381d1554c0d331865de16531b8067b8239ea87b98c3097c2b2d46e8bcbcc39180ff8f0046573135dc6094795b4cad039e118e78a2eebd8e20f0adb4a8d6f9b5fa3701ffaf0646573135c26094795b4cad019e6a473c51f78cab097c2b2d6a745ebe399780ffe3f8ef231c31561b8c323f0218c5b60a786a1cf144ddebae21f0adb4906ffbafd4bf09f83f8ec7ea2aa66a0c4699b7c5148e075deb8827ea1e7d2d816fa5c5189d97316112f0ff31c0e82aa66a0d4699b7c5148e5f39c6114fd4b3853104be9516f26daee5fa3701ffaf0346573135c66094795b4c2d039e3a473c4b0c9e25162d0e966fa585f4e55eaa7f13f0ff89c0e82aa6ea0c4699b7c5d412e099e88827ea59ce4402df4a0bf9b6f6ebfa3701ff9f048cae626aa2c128f3b6985a0c3c931cf1443d839a9403df51cf5372e13bead9402e7c47dde7ce85efa87bb6b9f01d75ff3117bea3eea5e5c277d47da15cf88ebac7910bdf51d7ebb9f01d75ed990bdf51d751b9f01d754d900bdf51e7b7b9f01d75ae960bdf51e71dbe3df7ed79dcbe0fe6b943a1b6e707f3187a308f25fedac05f1be4cab73f96f86b835cf92ed46b03df9ee7be3d97ebafa220fa7aec0d47be9719be651e9fb32c73e47b89e15be6f199c11247be171bbe651eef7f2f76e4bbd4f02df38b73e0bbbde1bb7d0e7d77307c77b0f876b0bd9389a0e1f5b730e05405798c81d71d68e1a89ee56abd4bf5babe8a71bdb6fb36e6fe520a6596827eaedb0e59b7d976e42333c645517cbecb13e043be4ba66cf2fcf815b049bbff32d8a45fc04b609363d38b609367522f804d9e593d0fb6313aff21d8e4d931f6d997e7ffdbc156adf3d8577c84ce6f059bf4a5c23ecad21f6e0bd8a44f23f68d957ea99bc0267d8bb14fa6f40fdf0036e9e38f7d01e53d8d756093776db00f9abc2fb5066c7b751efb3ec9776856816d86ceaf04db1f747e05d81ed0f99bc1f6a9ce7f09b6dfebfc62b0ddaff3af83ed773abf146cf7e9fc7360fbadce3f0bb67b75fe19b0dda3f3f82edb6f74fe3db07da2f3f80ed5749ddf09b65feb3cbebb73b7cebf03b65fe9fcd3609ba6f34f816daace2f02db2f757e21d87ea1f30bc03645e7e783ede73a3f0f6c93757e2ed87ea6f373c03641e76783eda73a3f0b6ce3757e26d8c6e9fc9360fb89ce3f01b61febfc1760bb53e79780ad85ce2f039b8c1989fd548a75fe0db0b5d279ec7f24dff79f04b6363a3f116c6d75be0e6cf26db8316093f1a06bc196d0f91ab095e87c35d8e4fc6c04d864fc93e1609373a961603b4ce787824dce7b86804dc6b31c0c36f906693fb01da9f39560936feb5780ed689ddf0f361973ec35b0c977ebf6824dc6627e086cf2bdea19603b41e7ff00361987e501b09da4f39f82ed649dff3dd8e41b9ef783ad4ce77f07b68e3a7f1fd84ed5f9df824dc6c8ba176ca7ebfc3d6093b1837f0336f9def32760eba4f3d3c17696ceff1a6c3296c8dd6093f1417f05b6ce3a3f0d6cf21deea9603b4fe77f093619efef1760936f0c4f019b8cebf673b075d5f9c9604beafccfc0d64de72780adbbceff146c3d747e3cd87aeafc38b0f5d2f99f80adb7ceff186c7d745eda19b53fabfd7c9f9eaf0ae23b2f53fede0f1a4e99ae0d840179e23cd72e051ef4b527f6ba2753e7f5b2dfb7d0eb9518da03be77c5ee3b7d4db15bafab955eef2ec3773194394b370e6ab977e1ff555007590eef63c9ba6599f361d9f78c75b7d7f5ddeda8bebb0c26e1de0d4c52e6dc53eacbfe50e7dbc23231b2a5ae8f25d602d010a72ac80b831bad92e578dedb189eddc0b327769ef4f5ba8b98c07d2beeeb75f33eae196ba5506617e8f79e03fd705f9775cbbcf8f3cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccfac78f6e93c3e579672fb4818c5b607785cdce7c7e7b0f8ccebbd53eafdee89dd6fc3e77badf57acb8d3a174399afe099d35e9d2f81ffcb768bda960e9e1366dc96e2af04ea83cf82f639e2d963f0ecb16821f9b2d87c2747b9d13859aefab2a867ec7b0d5df7593475b5bfeed1eb2a3234c5fdf57d83079f8d9600ef07fa3701ebf900eae0601fcf1817e20ff7a53d6093fcfbc0e8623be3b144da03791e2efef0b9f8af8de7e2f16ffb64b9cb76439ef99bcfdbb1ae52e6f7d0f67da6f3d837641faceb1f96ffcb94e939b5e8a7eabc23fe3aa7b6aff46994edbbc3e2fb6d608dc9778377688a74123f622f86fcdfa13f8794133d446b61c7f1ca91dd5cee7d63b95228b3d352ffaa20defaef30787618cc2a76be8038fb071cff5db5493b23343a1f3492327b40a3bd8e78f6183cc221fe5419d9fe6d8c32b26c3194f99fd046a9ba483b2ff5c4be2d780c70751c135fb26e99b79d1bef0646b38e2a3e061d5dcfbb2776defceaffd5a62cfd8bed7a5cfdbf64ddedf5b2c21118eb2f87f5ff8b2b883eb6fc6bfb96d5afdf65ffb2bd469d856537304999f665f5652fd1f96ccef50fd6755bd4b9fe4e073c89a0e1b5b79a321ddff118f32efc5fca947fb3a9aba37a96db8e5def19752a85329da09e0ece6332be0bbc037cbbd8e6a8859c43ed32b42886321dcbd2bfd27644e988d7aabb735297a4f57cb0dc521729d3a9acbe2e6dc11e2793cbed86e7596abd7b2c759532e796d597eda2f309d84ed896f6b3fc5fa64ced018ec5b32dfe3aa7b6afbcf326db779bc5f75bc01a93ef06df0291f37df123f662c85796d5979572a287682dec6a1f9177fe90dd5c6e97b15c2994d96ea97f55106ffdb7193cdb0c66153b5dcbeaf312472edbcded111a9583465206ef1fcbb11ddfbbb31df7f738e28e3aeeef0146b3ddc47317976c7b0d36f31eaaed7c50cac8b2783e786559fa57b5b3094b59f3deb08bfb98f80e6a00f5088cbaca8431e0e0dab03b5e3b493b257eba807d8fce8bce5d0ced8aa1cce0b2f4afc3f36eebbd4bf3fa0eaf2984dbdcb7f0dd8fa165f5dc3876e21efd5b02b68ff4afa3ebb4eeb67b86c261bb6738a2ac9e1d9715ae0f2d7531af915b045fbfa7fe955116efbb655acecc9be3502a7d3f32cad9fce0354f6cef6a742d2f47a61681fd7ec1fb067b51f0f53137653fc09833efa37431d683f751eacad2bfd2269965559bf43f8eacd747b6a36887ed09c6e4fbc058a5f3e5df6cea6aabbfcc8b3fc5f8815107376d57fa7da56cee03ef051e176dbba336ba1c8fb16d635b6f9f6adbf1ff7d43ab1c3eafb51ef3cd67ee6d8d7c3cbe9335b6fb4f362d7659785c3d4789d26297c5777c5af41c653b7ed8b4c865df87282ddeb3f88e518b5abcef99498b772d3c2eee4565d2e25d8beff8b4e8559ee9b9066ab1d3c2e3eade439416e22f5be6f70898db1af9787c77afb6dd27b369b1c3c2e3eaba394a8b1d16dff169d1b527dea3cba4c53b169ef8efcf65d6e21d8beff8b4e8dd07efe165d2e26d0b8fab67ba515abc6df11d635c8cb6ddcbb169b1ddc2b33dc75a6cb7f88ef1fcb0a7ed5e9b4d8b6d161e07f75d336ab1cde23b462d46e27dd74c5a6cb5f06ccdb1165b2dbee3d3a2ba87ed9eb04d8bb72c3caeee094769f196c5777c5a8cecad7c6f6984165b2c3c5b72acc5168bef18afa15271b1b9115a6cb6f06cceb1169b2dbee3d3a22675aeb5a9115a6cb2f06ccab1169b2cbee3d3a23c754cddd8082d365a7836e6588b8d16df31c645ea7a724323b4d860e1d990632d36587cc7781c49c5c5fa4668b1dec2b33ec75aacb7f88e4f8bdad4fda7758dd0629d85675d8eb55867f11de33d97545cac6d84166b2d3c6b73acc55a8beff8b4e8963aa6ae6984166b2c3c6b72acc51a8beff8b4189d7a26b6ba115aacb6f0acceb116ab2dbe633cef4cb517ab1aa1c52a0bcfaa1c6bb1cae23bc6f3ced4fd8b958dd062a58567658eb55869f11d63db993aef5cd1082d56587856e4588b1516df319e77a6b478b3115abc69e17933c75abc69f11de37967ea38f24623b478c3c2e36a0c94282ddeb0f88e312e526de7f24668b1dcc2b33cc75a2cb7f88ef1be56aaed5cd6082d9659785c8dd710a5c5328bef18af4752f7f89636428ba5169ea539d662a9c5778ccf8a52e7e04b1aa1c5120bcf921c6bb1047cef8ddd77ba3fb7f890be58e7195a144399933ba67fa52f56948eb20eec578675793df6baa4fb952d8ea8cbeb501729733ad4a56de0648ca2ee8eea9a8a99d7f4baa46ffa0796ba4a99b33bd697edacf309d8261fc2bafa5afe2f5391315f0579d14fd5f995f8eb9c8a55194346b6ef2b16df2f016b4cbebba2ef229dc48fd88b21dfa7637d5929277a88d6c2aef69157751ed9cde59618cb954299572df5af0ae2adff2b06cf2b0673eabd0788338923376d579ae9d5088dce038da40cf6d9fbc0118fd9875038c49f2a23dbbf8d5106fb504a990ba08dc27ea552cf44f0f57e938edab2aec82eeb9679f1570ab6bdc068d651c5c727d0f753c68a907124944dc685e806ebe965d8545d7b3baaabf89275cb7c6f6094712a7ae59e31d958c69e06a3e2e9eb40331c7b43a64cc78bbec0d3c7018fa37aa68e4315469d7a1b752a8532f86e6385837a16815f59b7cc57806f17db1cb59063f2d98616c550668471fe18a5a3ac43c56f2f4b5dfa3bae8bac5bdaa5fe39f05d69f8ee61f84e040db7731064debf2a81b99f0366b5de01f1afb71ccfdb24a6c44f0fa8d340d020ae3ae1bae43c6fa0a16d31e4a7c1799e9493b272fc127615cbb22d91dd5caeafb15c2994e96fa97f55106ffd07183c030c6675ecbe13ceed1cec0fa918e86f70c87c0fd06e408476fd413b2983c7bf9e8eb4eb67f0c87c4fe091739c0ab0c9b982f027e0ffdd72c06db67b15166eb1e138713d2d8c3de2674c9debf4341865be07308aad1ff0543ad2ccdcd6671bfae071b98d5146962d8632b3e1d898b09455fb5da7a2fa7ab5d4f6d8de1dd36d7a6b077ae1388d01e813181aca240c6d83fab11ce3e46917d48fd538656adde491778cbe7e74fad1a3a0151b98f85b64a9460bb061bea5c516040d87a42c069b0c49d90a6c2d0c5970284c292f43dab9900bf59075171b9c6d81254edf389ca74c9942a70df0b80865153a32a4a70e9d9b278f9d3a1ae3a395c1d994d851ff6b99a15cd4ba5c6d07739fa8827933068b1df96f09f5ad8279f1a7b64da9ce4f1c39eaae8193ef98367ef484a953502873c7c67c51d0700398bf5182bbdae93000b0c2d838b432ea850d86fc4f364cbbf839bbe398b9a63601f893a91de8768803ddd4fa65ecdb5123c78dbb765af5b8b1a32e993661d4d4b17513706bb635948bdad2f2ffd660b335f158564dd86ce1b26d2c36db84a30cb7059b1cb90e019bf0b4035b4bc84b7973cb3809d74eb07ed9a5d4ff9438ad74c5db04f521208763d5aeaafd577d3e569d06a9a18ed5d0c66a73aaa18bd51d433534b1fa8a9d1a7a580d35ac86163e3e480f1dac860a3e29480f05acbe765116a487f63d35480fdd7b7a901e9af74ce0fb0e309f15a44fbbd4d0ba9d83f4d0b9ead6a57a755d7de64dbd5baf4edfd56d0175caab2ef1d4e9a73aed549717eaf685ba95a54ee9d4e9b23a1554a76fea726480d67a60982e08d38561ba284c1787e992305d1aa6cbc2747998ae08d39561ba2a4c83c2747598ae09d3b561ba2e4cd787e98630dd18a48777be29480fbfae867fbe25480f0d7d6b901e36fab6203da4f4ed417ab8e991417a28ea51417a98ead1417a08eb3b82f4f0d66383f430b97705e9a176c707e9e17ad570d86a986c357cb61ae6570d09ac861456430dab6189d510c66a08643534f27d417ac8653564f383417ad8e719617a384c8f84e9d1307d2b4c8f85e9f1203d3cb81a367c66901e665c0d3f3e27480f573e2f480f6fae863d57c3a1ab61d2d5f0e96a587535ccbb1afe5d0d0bff7c985e08d38b41fa91847a14a31e51a8dbffea3198ba45fd7a90be75be34483fe2568ffc551708d5254475915919a4bb50a92e65aa8b9dea72a8ba60aa2ea9aa8baeeab2acba70ab2eedaa8bbf7ae541bd02a25e8951af08a957a6d42b64ea953af58aa17a4d54bd76a95e2356af55ef09d2b7c5f705e947a5ea76b87a34a06e99abdbf71f87e9db413a26bf1ba6ef85e9fb61fa41987e18a61f05e9618dd570c76ab86435b4b21a86590dd9ac8672564341ab61a33f09d2434faba1ab7f17a487c4fe344c9f85e9f3203dbcf61761fa6398be0cd39fc2f4e730fd254c7f0dd3dfc2f46f61faf730fd4798fe1ea67f84e99f41fd30dbd8901caf5b1f7d05138c9c3a75f4f88953cba6d6958d9f366eead889e3ee2d9b3e76ea98b2babb474fae1d57371d17fe8e5e58c6081f3879f2c87bcbc64ea8197d4f59ddb4a96575b565d575d326d4343888ff452f74e2d73d8eaca98976f65fdf84f4ff34d1e921ba5d94d1d72fcf5cb792964d10e4f0a62cd4b365d32a34591fc1e452f786f47970d994717553cbcacb26847fc3036fddf4d1355dcaf07f534291a74c2d9b3275e4e4a965b593ebc69775ed82eb7da85d132af1dfeddcc09c717cd3c4e9a4bfb3d4a410fbd5294d50e03f4f691a69ebb26f40daaeac694ecbca9a50c3339bb2d0154d24bcb12c529629d3aaa74e1e396a6af4c2b77c93856f6f4a352734b19a27756c82b3d39ab2d0c08e4d23bcbd29ce6665e12cf8ffbd834b67845506009b2d6c6f00000028401f8b08000000000000ffed9d77941cc5b5c67b3629cc8e562b6995c39264a55dcdcee6555ae52c106072d04a5a2119492ba4251963c08073ced938e300d838e28073ce09837304836d78ffbce377de3b87f3aa7aea7abf2d558f7786aed5ed9ddbe75c4df59d9abebffafa564d6f554feba9200852417eab54764670f246eff79ad7ec33db5a623c56d627672a219c1509e1ac4c0867554238ab13c2599310ce7109e11c9f10ce0931726ab68a60f81637ef440fbac6cd984e98a6b509d03493304d272540d3ba201963d4e48470d62784734a4238a72684735a42381b12c2393d219c3312c23933219cb312c2393b219c7312c23937219cf312c2393f219c0b12c2d99810ced312c2797a4238cf4808e79909e13c2b46cea5c0b9d0bc3ecbbc2e32af8bcdeb12f34a9f59665e9b4c1babcc7eb3b2e59a4d598bf55e4e59abb23665edd67b1dca3a957529eb36ef359af77a94ad50b652d92a65ab95ad313aac55b64ed97a651b946d54b649d966655b946d55b64dd976653b94ed54b64bd9d9cace51b65bd9b9cace5376beb2672bbb40d985ca2e5276b1c57289b24b955da6ec72655728bb52d91e657dcaf62adba76cbfb27e6507945da5eca0b243ca9ea3ec6a6587951d517654d980b263caae51765cd9096583caae55769db2eb95dda0ec464bb3e72abb49d9f394dd6c713e5fd92dca6e55769bb21728bb5dd91dcaee54f642652f52f662652f51f652652f53f67265af50f64a65af52f66a65af51f65a65af53f67a656f50f646656f52f666656f51f656656f53f67665ef302cd411dea9ec5dcaee52f66e65ef51f65e65ef53f67e651f50f64165772bfb90b20f2bfb88b28f2abb47d9bdcaee53f631651f5776bfb24f28fba4b24f29fbb4b2cf28fbacb207947d4ed9e7957d41d917953da8ec4bcabeacec2bcabeaaec6bcabeaeec1bcabea9ec5bcabeadec3bcabeabec7bcabeafec0796e63f54f623653f56f613e3fba979fd99a94bf3623f57f60b537ec8bcfed2bc3e6c5e1fb13ef32b65bfb67cbf51f65bcbf73b65bf37e53f98d73f9ad73f99d73f9bd7bf98d7bf9ad747cdeb63e6f56fe6f571f3fa8479fdbb79fd8779fda7797dd2bc3ea5ec9c867c797c30b4f506318d516d07b27a4d85c45f180cdfb41695e63d7a6d34fe2ab34fafa45db5d9afb6fc3566bfc63ace78b33fdef2d79bfd7acb3fd5ec4fb5fc0d66bfc1f2cf30fb332cff9966ff4cf0a7039873357eedab34ae14f8285f2bc0576d7c95e0aba1c3816f9cf155838fce6f0df82618df38f04d34bef1e04b1bdf04d25259adf1f50671e54ab64f1f3713f771cd3ad4a4f879f7e9e3d679e29d1c3f6fbf3e6ebd075e9d1f53ccb12643de4c35be7af04d33be29e03343d0bffb9cf64d37be69e09b617c0de09b697cd3c137cbf866806fb6f1cd04df1ce39b05beb9c6371b7cf38c6f0ef8e61bdf5cf02d30be79e06b34bef9e03bcdf81680ef74e36b041fdde3721af8ce34bed3c17796f19d013e1a6bcf041f5d1b9e657c7a9c189f82cf183f8d51e167687c06df221a9bc1b798c665f02da131197c4b2136f996c1b842be26e3a3314abfd763cabd415c7d2217f68915711f571d591f7755fcc70dd7ed560743baf6429c15a0d51a538ef1dea0168c9d324671c85f05e5ad5097ea911ef43d43ecfafb64a529af29f0b91eeb7319a8b3d2d1fede20def6afb2785659ccd5d07e3f39db9a939c1df15674ce5e0875eddca36b9eb198b33b80c343ce7648ce8e782b3a67fba1ae9d7b74dd3b1673f612e0f090b37d7e723697959ccdcf9105813bf7e86f9fb198b3078123fe9c6d979c1df95674cede0675eddca3bf7fc762ce5e071cf1e76c679f5c1b8c782b3a675f0575eddca3b998b198b3770087879ced977176c45bd139fb0ea86be71ecd0b8ec59c7d2d70c49fb3dd9e72b6557236c8af7706813bf7688e7a2ce6ec5dc0117fceee93f9d9916f45e7ec0350d7ce3d5a2f198b397baf29eb75869f9a7586b9e0fb99f1cd03def8737b7f9ba7dcce496ee7ef030902778ed2dadd58cced074d59e7f14370ef01f97e697ca781ef61e33b1d7c8f18df19d02e0f7da04ffac088b7a2fbc0afa1ae9dcbb48e3c16fbc08f81c343ceee939c1df15674ce3e0e75eddca37b1ac662cefe0e383ce46cbfe4ec88b7a273f65f50d7cebd45a63c167396ee2bd5d70b7f30d70b4bc0f747e35b0abe3f19df32f0fdd9f89ac0f717e36b06df5f8d6f39f81e35be2cf81e33be16f0fdcdf872e07bdcf85ac1f784f1b581efefc6d70ebe7f185f07f8fe697c9de07bd2f8bac0f794f1751b9f5eefa27bafbe6b7cfadc9246bd41bce796eeb1a463d3feb251885d67c5ae1bc5d8f556ec7a47ec260fb1d31083b694b5df0be526bf3cd94c30fcf71f146b79fcb15a75db9b8391b77d39f0643db43d0d3146c293059e96f879c27b7d73f11f373cc7cd96a66988d50ced6af5d0ae14c4a263d33ec5cb800fc7ef5607635bfc8cb914c4a263d37e1b30920fbf4fe87b9dfa8ffe3e5c981ae2f5d097c26b228cd70b1c14af0aea3c396da8ee12c3560befe3776b8be5f39497615e502c3a36ed53bc5a684fcbe833e646ca98b5187d8d11298845c7b663637f6f1a7dcd46745e33e03b056352aed431a916d846e33a25ea5c7389ede3fb2a0531686c23cd295e15d4995e395477338cbb1efa5faed8eb371c0fe2cfe35c16fbf548785a81c747dff7d45fb3f8bdff74106faeb55b5ab5585a65a04e1be8d7ee41bf42d721144f98855998855998855998855998855998855998855998855998855998855998f933e3fd17b8be49f5963161245f0e787cccf387cf8f32c7a2e3eb759d87615d27fe758b5c16d72ce91ec3c5569baba0ce13a921b6dfc07ababd36886b9acbfc6a37a2fb2c6a8393d7627dae2146ad03bbd62f1b638b9ddbe76bbd4d3f43453f87acd9d2759943530ff7a90cd33465698af7292eb578749eceaa1c62f3b1f657ec5a246a45e538d7f6f01e03bfe7253f7e502e5404c3c70ffc9ee9883df6f0354c5a2fefb06257419dff490d9d9b2e78bf3738f99e275da7d33a367d66317cb6d33a769df92c71d458c76f86cf529dff8331f59d15c1bf35f371ff078ecb01b415b75e28e3ba79fcdfc3f975fcd62278da81c7c738e3e97a238b7d20ee75fc4e4b2bd7750cd5e900fd3a3de8e7ba16a57d8a27ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccfc99f1b7a2c49a867a39268ca374ef43b89e41cf7fc1b5a997570cc5f5bd0e476b4e4bac3657419d1f540cb1bdda946b8393ef77883a971ed6f30a9e4b8a570bedc1b5205fbfe76eb378da1c5a50b931b6d8f975fcf8351e5ac76fb574cd3934f5d55f718d1535c5feda62f1e0da686d70f2bd256938ce68dc3b149517140ffb521bf8a88cbf8ff6719ef1bbc4beaf87e2e1faf5dd46dbbac0d7b9cf657d8e1bb4364f6bf5ad8eb6529d7b60ecbbcf94f11e0ebc77e441c7fbb4155aa726fdbc3ccb2e9b5ff7a567c0d1f9ed71c45e09ac31c56ec1d829631487fc5550fe62c5505daa477a90d6c4aefb083d130cd9edcfb5589fcb409d6e47fb7b8378dbdf63f1f458cc3a77ee873c7b10beff7d8d49dd111a2d068da80e5e07f9ba27cf1e23edfb1bf1bebd71561dbc66a13adf84312aeafe51d73d87bebec7a2ee39745d1bb703a3dd46fb3ecf72bf4feb21182fe2be4feb21c821bc4f2bb08ebf048e4f5ce382e8ef16aaf32bebf8f635397d06ef03a33abf85f1a2cedcb3581b9c7cfd8df74c8dc6df5751f749533cbcaec1befd9fdaae99bba07e6f8ccc9813c882f944751eb3ce596704f772c7679f88f82c69d564caf8f78bad9fd6a11b3ed31b8b0ef93edf63b585f2ba1bda4275fecbba068cffba257f0d187f5b875f93d038d0e6682bd5f96fe86bff826b3c3a4f385ed5549efc3e6d85ae01493fdde6d17e3e30c6e6f07ce0eacaa1baf6737e49eb629f0fdc617d8ee3f381ff17f2ac06ee43f73556af8cd06809684475f0b741f43d82cff2757dc7f8bab73fea3bc6f50c4a1cdbeb2a479fcd9e57735d23501dfa2c5e234c33cc754667bbae3d5f48df9771de378cbf956886b8f85b89664f7a6641b75ed8c7eb8253193beb2976d433a7b3a3103bea99d3a311bbde8a5d3f8ab14573d19c93e61e9e891cfefe0c9f59aab742d7a5c49081cf552480b132018c550960ac4e00634d0218c72580717c021827248071620218d3c0782abfdb3de8932b551f5fe7abd0b506c66ef2a44531ff7f87e7ff4ba5e0b50fc6f6f0375da8455330722df0ef3c1fcf7e28f6ff7a2106fcbf0ba62480716a0218a72580b121018cd313c03823018c3313c0382b018cb313c03827018c7313c0382f018cf313c0b820018c8d09603c2d018ca72780f18c04309e9900c6b312c0b8501863615cea9731572aa3e6f1f17ffe3d93ff73cc034fd675cfa9a7df9e14fdffad797e3e694ba9cf8dc37b4bfcfe9f70cfecd9763eee1d29f6d97685febf554f8cb952197dddc78ebfe319090ffe2ed2f5db1a0f8cb952197dfdfe057fa337129e0ed0acdda19907c65ca98cbeee952bf65e4ebca7bfc3a19907c65ca98c785f758c3ca1669d45f07481669d0ecd3c30e64a65f4755f721a628c84a71b34eb7268e68131572aa3a7dfb6859a7517c183bf01eb7668e68131572aa3e659e149b39e22785680663d0ecd3831224fdccfc9ee71c4f2f19bc162db4e0cc83821018c1313c088f749f818bf0add27d1e3579f5ca9faf83a5f85ee93c0d81e7e1f136a81bf87f84f5aacf2cb53f03e098cbdda9316f87b95ffa4c56ae0f1f1fb9934c418090f3164e0735312c03835018cd312c0d89000c6e909609c9100c69909609c9500c6d909609c9300c6b909609c9700c6f909605c900046fc5bd5c3b562c1bf5f568ff1d8517fab8cf5d8517f978cf5d892e792e7e5105bf25cf2bc1c624b9e4b9e97436cc973c9f372882d792e795e0eb125cf25cfcb21b6e4b9e439a7d84998e317c6b1c7883c8df1f164b1ed18ab9741db7b1d3c294f6dc7586b19b49d1892c6b826018c2b12c0283ae6ef412c8551f3acf3c4b3b6089e75c0b3de13cfba2278d603cf86f879c29c5a5f040f3164e0732b12c0b826018ca2a3e8c88951742c1f1d8551188551184f056312c670614c443ee64a65d43c1be3e70935db5004cf46d08c3ed7e29731572aa3e6d9143f4fa8d9c622783681661b1d9a7960cc95caa87936c7cf136ab6a9089ecda0d92687661e1873a5326a9e2df1f3849a6d2e82670b68b6d9a19907c65ca98c9a676bfc3ca1665b8ae0d90a9a6d7168e68131572aa3e6d9163f4fa8d9d62278b681665b1d9a7960cc95caa879b6c7cf136ab6ad089eeda0d93687661e1873a5326a9e1df1f3849a6d2f82670768b6dda19907c65ca98c9a6767fc3ca1663b8ae0d9099aed7068c69571450218d72480d1b38eb9521935cf2e4f3c3b8be0d9053c677be2d95504cfd9c0734efc3c614e9d5d040f3164e0732b12c0b826018ca2a3e8c88951742c1f1d85511885b138c6de0430cab91646ae8c1efebe2af81b9ab3c778ec3a2b765d99c48efa0dcd588f2d792e795e0eb125cf25cfcb21b6e4b9e47939c4963c973c2f87d892e792e7e5105bf25cf2bc1c624b9e4b9e97436cc973c9f372882d792e795e0eb125cf25cfcb21b6e4b9e47939c4963c973c2f87d892e792e7e5105bf25cf2bc1c624b9e4b9e97436cc973c9f372882d792e795e0eb125cf25cfcb21b6e4b9e47939c4963c973c2f87d892e792e7e5105bf25cf2bc1c624b9e4b9e738abd3bfed8b9629f31b31b787c3cf3c6533bb3fab8e79a633d1da37e5aabf32cadceb6b4ca409d7341bff33ce89782b8746cdaa778c5323f8b01b3a7d8b949ea1813a0fd14638da5878e7fbea7b6478df5e78ff1d85163fd588f1d35d68ff5d892e792e7e5105bf25cf2bc1c624b9e4b9e73898de5ea60e8ba9d9e7faa8ff16c783f65b1eaad0aea9c332eff5a17481ff2115bfa907c5794436cc973c9f372882d792e795e0eb125cf25cfcb21b6e4b9e47939c4963c973c2f87d892e792e7e5105bf29c5f9e633e548c024f60f10405785633e3d9c68c6733339e2e663cf399f1b433e399c98c27c78c670a339e0dcc782630e359cc8ca79219cf5a663c59663c3b98f12c60c6b38419cf2c663c5399f14c64c653c58c671d339ee5cc787632e3d9ce8ca78719cf42663cddcc783632e3e960c6339b194f2b339e69cc789632e34933e36966c653cd8c670b339e26663c8b98f1ec62c6b39219cf1c663c0dcc786a99f16498f1d430e359c58c672b339e4dcc783a99f1cc65c6d3c68c673a339e65cc782631e3a963c6b39e19cf38663cf398f1cc60c63399194f3d339ef1cc7846e37943c5f0a418f0a483939f499686f77783afc2faac1eaf5a1a86debfc0f82be033179a72a5e3d817808f7e1b7ea1e3b3a8d305d0965e53ce3eb32dd40963f5c23ec5ab058e0b99f0ec66c6339e194f3d339ec9cc786630e399c78c671c339ef5cc78ea98f14c62c6b38c19cf74663c6dcc78e632e3e964c6b38919cf56663cab98f1d430e3c930e3a965c6d3c08c670e339e95cc787631e359c48ca78919cf16663cd5cc789a99f1a499f12c65c6338d194f2b339ed9cc783a98f16c64c6d3cd8c6721339e1e663cdb99f1ec64c6b39c19cf3a663c55cc782632e399ca8c6716339e25cc781630e3d9c18c27cb8c672d339e4a663c8b99f14c60c6b38119cf14663c39663c3399f1b433e399cf8ca78b19cf66663cdb98f1ac66c653e1e0f1f0ff5f863c74ff1a1d9bf6773389ede13c84ffefe7459eda74b139568d392ef153bc2aa87389b930d0f7a3e06789cbbedf10ef9dbb1834bad8535be87ca4acf3e339760eefab0c8021b0f4091c3c3eee47f5d4ce617918e3ff3f9bd55a5d6269659fbb0cd4b908f4bbc4837eaedcfe771f30af4964d63cf4dd41ac69a8b79a0923f9cef7cb13f6dbd5c1f0ad50bfbd04787c8c619eda19f6af4bad36ad76e84e7530572ff5d04e57dfa1fd4be13c248d59f3ac3565624d43bdb54c18c977b15f9eb07fad0d866f85fad7a5c0e363fcf1d4ceb07f5d66b569ad4377aa83b97a998776bafa0eed5f06e72169cc9a679d29136b1aeaad63c248be4bfcf2b4a5a1cdb415ea5f97018f8ff1c7533bc3fe75b9d5a6750edda90ee6eae51edae9ea3bb47f399c0761166617b3e6a1df98106b1aeaad67c248be4bbdf2b465d3d066da0a8d6397038f8f71de93eee1387685d5a6f50edda90ee6ea151edae9ea3bb47f8523766310af16578e408b2b1d3c578eb21614af58e68b12c82c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e8ac37d15974169d45e738984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da39839e8ac79e81931c49a867a1b983092ef32bf3ce1ef823604c3b794b5df0be52b81e7720ffa786a67780ff91eab4d1b1cba531dec5f7b3cb4d3d577687f0f9c873d45305f914066d1b93466cd43cf8a25d634d4dbc884917c97fbe509c7b18dc1f0add038b607787c8cf39eda198e637d569b363a74a73ad8bffa3cb4d3d577689fe209b33047316b1efa3f6c88350df536316124df955e7972e1ef1b3705c3b742e3581ff0ec899d273f8e79d03d1cc7f65a6ddae4d09dea60aeeef5d04e57dfa1fdbd701e8a61be2281cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a8bce51cca2b3e81cc52c3a978fce9a87feef10624d43bdcd4c18c9b7c72b4f6bb8eeb03918bea5acfd5e28ef059ebed879f2eb0e1e740fd71df6596ddaecd09dea60ffdae7a19daebe43fbfbe03c8c75e62b12c82cb9313acc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc1c7243f36c3165624d43bd2d4c18c9d7e797277ceec19660f856e8be9d7dc0b3d7833e9eda19deb7b3df6ad31687ee5407fbd77e0fed74f51ddadf0fe7419885d9c5ac79b69a32b1a6a1de56268ce4dbeb97271cc7b606c3b742e3d87ee0f131ce7b6a67388ef55b6ddaead09dea60aef67b68a7abefd07e3f9c0761166617b3e6d966cac49a867adb9830926f9f5f9e701cdb160cdf0a8d63fdc0e3639cf7d4ce701c3b60b5699b4377aa83b97ac0433b5d7d87f60fc07910666176316b9eeda64cac69a8b79d0923f9f6fbe5c9a5a1cdb4151ac70e008f8f71de533bc371ec2aab4ddb1dba531dccd5ab3cb4d3d57768ff2a380f4963d63c3b4c9958d3506f071346f2f5fbe509fbd78e60f856a87f5d053c3ec61f4fed0cfbd741ab4d3b1cba531dccd5831edae9ea3bb47f10ce43d29835cf4e5326d634d4dbc984917c07fcf284fd6b67307c2bd4bf0e028f8ff1c7533bc3fe75c86ad34e87ee540773f5908776bafa0eed1f82f3903466cdb3cb9489350df5763161241f7e5fecf2c493b178320e2dc662ec3a2b765d99c4aeb762d797496cc973c9f372882d792e795e0eb125cf25cfcb2176b9e69a685e9e9aa74ea1e6a953a8794a3467a9f9d3f1c56ec771a502621df4d44edc7aa18cf373b47531e399cf8ca79d19cf4c663c39663c5398f14c60c6b398194f25339e2c339e05cc789630e399c58c672a339e89cc78aa98f12c67c6d3c38c6721339e6e663c1dcc786633e36965c6338d19cf52663c69663ccdcc78aa99f13431e359c48c6725339e39cc781a98f1d432e3c930e3d9cd8ca78619cf2a663c9dcc78e632e36963c6339d19cf32663c9398f1d431e319c78c671e339e19cc782633e3a967c6339e194f8a014f3a38f9f728f87b824af0d1fdfdbbc0f71c53de0dbe0a470c3ace21f0d1fc291d438f372b1b4e66a880cf5cede07a8e231ec5b9daf1d9d1d01d63f5c23ec5ab058eab99f08c67c653cf8c6732339e19cc78e631e319c78ca78e19cf24663ccb98f14c67c6d3c68c672e339e4e663cab98f1d430e3d9cd8c27c38ca796194f03339e39cc785632e359c48ca789194f35339e66663c69663c4b99f14c63c6d3ca8c6736339e0e663cddcc781632e3e961c6b39c194f15339e89cc78a632e399c58c6709339e05cc78b2cc782a99f12c66c6338119cf14663c39663c3399f1b433e399cf8ca78b194f858367b7279ea8e729ec66105bef674117bda5e1fdd1f81de06e8b91f60f0223f2124fd6134fd43328b20c62ebf6d3df12b4069786f7f1775cbe722a6b31d2be2ba7f0beb4e59e78a29edbb19c416cad05cd5dd23d0069781f7fb7e02ba7965b8cb4efcaa97abf3ce1ff2dd1140cdf0add6b847dcec739f4d4ce2cf6bf189fa1e17c167593a5153e437534ee938f1a0f289e300b7314b3e6a1b50b62c5efb3d1f8dddb48185ddfaf1e78c2f1b13918be151a1f0f028f8fef0f4fed0cc7b1c3569b9a1dba531dccd5c31edae9ea3bb47fd811bb3188578b2323d0e28883e7c8286b41f18a65de9d40660e3a6b9e65a64cac69a8b78c0923f9b27e79c2f17159307c2b343e1e011e1fdf1f9eda198e0947ad362d73e84e75b07f1df5d04e57dfa1fda3701e8a613e9c4066d1b93466cd4373c8c49a867a39268ce43be89527974d439b692b348e1d051e1fe3bc27ddc3716cc06a53cea13bd5c1fe35e0a19daebe43fb03701e845998855998855998855998855998855998855998855998855998855998859937b3e6a1df36126b1aeab5326124df11af3cf97587d660f85668dd6100787caccb78d23d5c773866b5a9d5a13bd5c15c3de6a19daebe43fbc7e03c08b3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300b336f66cd43cfdc26d634d46b63c248bea37e79c2df6db505c3b742eb0ec780c7c7ba8ca77686eb0ed7586d6a73e84e753057aff1d04e57dfa1fd6be03c08b330bb98350f3ddb8a58d350af9d0923f906bcf2e4d74fdb83e15ba171ec1ae0f131ce7bd23d1cc78e5b6d6a77e84e7530578f7b68a7abefd0fe71380fc5301f4e20b3e82c3a47318bcea27314b3e82c3a47318bcea27314b3e82c3a47318bcea27314b3e82c3a47318bcea27314b3e82c3a47318bcee5a3b3e6a1ff738d58d350af830923f98e79e5690dd71d3a82e15ba17587e3c0e3635dc693eee1bac309ab4d1d0edda90ef6af131edae9ea3bb47f02cec358673e9c4066c98dd16196dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e62e6901b9aa7d39489350df53a993092ef1abf3ce1730f3a83e15ba1fb764e00cf710ffa786a6778dfcea0d5a64e87ee5407fbd7a08776bafa0eed0fc27910666176316b9e2e5326d634d4eb62c248bee37e79726968336d85c6b141e0f131ce7b6a67388e5d6bb5a9cba13bd5c15cbdd6433b5d7d87f6af85f3903466cdd36dcac49a867add4c18c987dfcbdd9e7832164fc6a1c5a98aadf77b4cb9d6bca6e1fd1e60f4351e765b8cb48f398ebcc4d3e389a7cee2a9736871aa62ebf6af34e549e6350defaf04465f39d56331d2be2ba7ea8067a5279e7a8ba7dea1c5a98aadb55865ca93cd6b1ade5f058cbe726aa5c548fbae9caa079e559e78a2c6a455a3103baa7f8d46eca85c198dd8a2b9682e9a8be63e354f9d42cd53a750f39468ce4a730fd751e17c2fc5088001b75e28e3df0a3eae3d3db533ebfa7b6c95d526fc7b0ce71c4ed5df1bc22ccc51cc9ee62ddad2566cd227b078681bf4acc568ce9bf6586d4ac2bc6921e6c30964169d4b63d6b1af8b3f765bda8a4dfa04160f6dd779d6c2533bc3f1e0fac0ad31c5cb401dccd3eb3db4330571e9d8b47f3d9c8762980f279059742e8d59c7be21f6d8f9e7c9636cd227b07868bbc1b3167eda991f0f6e0cdc1a53bc0cd4c13cbdd1433b5310978e4dfb37c2791066611666611666611666611666611666611666611666611666611666611666decc3af673638f9d9fbfc7d8a44f60f1d0f65ccf5af869677efefea6c0ad31c5cb401d3ce7377968670ae2d2b169ff26380fc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2cc9b59c77e5efcb1c3dfe3606cd227b078687b9e672d3cb5339cbfbf39706b4cf1325007cff9cd1eda9982b8746cdabf19ce83300bb38b59c77e7eecb1f3eb79189bf4092c1eda9eef590b3fedcc8f07b7046e8d295e06eae039bfc5433b5310978e4dfbb7c0792886f97002994567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a5974169da3984567d1398a59742e1f9d75ec5b638fdd1acedf636cd227b07868bbd5b3167eda999fbfbf2d706b4cf1325007f3f4360fed4c415c3a36ed53bc72603e9c4066c98dd16196dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e62e6901b3af60be28f1dfe9e1d63933e81c543db0b3c6be1a99de1fd2fb7076e8d295e06ea609edeeea19d29884bc7a6fddbe13c08b330bb9875ec3be28f9d4b5bb1499fc0e2a1ed0ecf5a786a67381edc19b835a67819a883e7fc4e0fed4c415c3a36eddf09e72169cc78fe52f1c50eefdba41815e655fb5e68ca95e07b91295781efc5a65c0dbe9798720df85e6acae3c0f732681bf95e6eca4bc1f70a535e05be579af24af0bdca947bc0f76a53ee06df6b4c79107caf35e56bc1f73a53be0e7caf37e5ebc1f70653be017c6f34e51bc1f726537e2ef8de6cca3781ef2da6fc3cf0bdd5946f06dfdb4cf9f9e07bbb29df02be7798f2ade07ba729df06be7799f242f0dde5f0bddb945f00bef798f2ede07baf29ef06dffb4c7902f8de6fca13c1f70128d3eb074db9167c779b72067c1f32e549e0fbb029d781ef23a63c197c1f35e57af0dd63ca53c077af294f05df7da63c0d7c1f33e506f07ddc94a783ef7e539e01be4f98f24cf07dd2946781ef53a63c1b7c9f36e539e0fb8c29cf05df674d791ef81e30e5f9e0fb9c292f00dfe74d19cfef174cf90ef0d1b87227f8685c7921f8685c7911f8685c7931f8685c7909f8685c7929f8685c7919f828ef5e0e3ecabb57808ff2ee95e0a3bc7b15f828ef5e0d3ecabbd7808ff2eeb5e0a3bc7b1df828ef5e0f3ecabb37808ff2ee8de0a3bc7b13f828efde0c3ecabbb7808ff2eeade0a3bc7b1bf828efde0e3ecabb77808ff2ee9de0a3bc7b17f828efee021fe5ddbbc14779f71ef0359af27bc1779a29bf0f7ca79bf2fbc1778629e33873a6297f107c6799f2dde0a3b1f043e07b96297f187c8b4cf923e05b6cca1f05df1253be077c4b4df95ef02d33e5fbc0d764ca1f035fb3297f1c7ccb4df97ef0654df913e06b31e54f822f67ca9f025fab297f1a7c6da6fc19f0b59bf267c1d761ca0f80afd3943f07be2e53fe3cf8e87b9cc619dd9f75bf241d4823eda336373bda42bef1d096de20de6b3a8a45c7a6fd5660a473901b7dc6dc48195b2c46cdd3ee4133cc2bda0afdcdd40e3c6d1e783cb533fc9ba9c36a53abd5a60cd47916b4b3c3433b5310978e4dfb1d10dbc739472d6acc7117595a54419d6af385a6bf4f0be948c7d0f99b73b4a5db735be8d8342e758f42ec4e2b76d68a8de3316d85fa572730777960d6c7ed89ffb861ff5a618e45394571b2d0a695a0415c6dc2d829631487fc55509edd305497ea911ef4fd45ec3a97e95c22bbfdb976eb7319a8d3ed687f6f106ffb7b2c9e1e8b595fd3d7350c7178e80f610e745b1cb49f05ed7a22b4eb06eda80e7eff3579d2aecbe2a1fd26e0a16b9c0ef0d1b502f1e37556f32870dbe35e87839b7c9dc0d8e460ccc5cf185eeb34598cb49f0346f275014fa727cdec73bdc8d207bf97c75975e8b3555067397c37a61d7575bf5b981a6a17fd0dfe7410ef985ee3412f9c1f08409fc0d2903662181f0ccd21c4c93331189a2338313870bcefaafe73fbfbf6a700adcac2c4d794a31915e0c372a5c31704c3a742704a96a642704ab6c29205a760a8befe534a378ba61bfa8f1c1a7cf6d1fea3fb8edf786cb07fff8e81ab90badaa247d2a8162029fa681b1f0c4ddaf406f12ec6d458b10a25cf78781d07ef539dec33db5a3cb533fcd29b60b5a9c66a5306ea54c37b133cb4330571e9d8b43fc1113bc68128d462e208b498e8e09938ca5ae0c437f9b0a7d2fbb8785261b5057b34b6c9cef3581b440117c2f153064ebfa73b7bb569ccb860e864d3e8a9af68f549d033a6fa5b4bcf88ea19503d04e9194e3da3a9bfd4f48ca59ea1d433927a0652cf38ea19463da3a86710f58ca19e216c0cf233807ac64fcff0e919bdb380edbbc0abffaad6df907a464ecfc0e919377d65a5af00f4d588befad6578a7af6435f21e8bf2cf52c83feb6d55732fa5b5a7fb3ea2b457d85a8afe8f515ae5ea55aad6c8dd17aadb275cad62bdba06ca3b24dca362bdba26cabb26dcab62bdba16ca7b25dcace56764e909f5d3f57d979cace57f66c651728bb50d945ca2e567689b24b955da6ec72655728bb52d91e657dcaf62adba76cbfb27e6507945da5eca0b243ca9ea3ecea207f87ce116547950d283ba6ec1a65c7959d08f22b667a854caf88e91530bde2a557b8f48a965ec1d22b567a854aaf48e915a85b83fc0a935e29d22b437a5540af02e8597f3dcbffe2203f8baf67ed5f16e467e5f52cbc9e75d7b3ec7a565dcfa2eb59733d4bae67c5f52cb89ef5d6b3dc7a565bcf62eb596b3d4bad67a5f52cb49e75d6b3cc7705f959643d6bac6789f5acb09e05d6b3be7a96f7ee203f8bab676df52cad9e95d5b3b07ad655cfb2ea59553d8baa674df52ca99e15d5b3a07ad653cf72ea594d3d8ba9672df52ca59e95fca2b207957d49d997957d45d957957d4dd9d7957d43d937957d4bd9b7957d27c8e7e5f7947d5fd90f94fd50d98f94fd58d94f94fd54d9cf94fd5cd92f943da4ec97ca1e56f688b25f29fbb5b2df28fbadb2df29fbbdb23f28fba3b23f29fbb3b2bf28fbabb247953da6ec6fca1e57f684b2bf2bfb87b27f2a7b52d953c1d0ea060e22ff323b34d3de3738d87fe4d860e3e040e3916b0f0f1e3a76f8c6c6eb0f0d1e6c1cb8aefff881c303d7e3873f68862d5a46587bfc78df8d8d878eeeefbfa171e0dac1c681038d7b07ae3dbaff047ee81be643734f8ed8b77f7f74b05f543c03d2474a0cfaa8f91c2dd06c2ddcb6c74b11e4a9523e34b5b2b4069d6dbe75e8aff7f3f257bb8d270e0f0c36661b8faa7ffb0eabcff4ef6f6ec4f74e28914f0c369e18ec3b3ed878e0f8c091c696663ceec5134a68445543091f6a6e1879cb83ff072748e4d5250a0400", "privateFunctions": [ { "selector": { @@ -37,8 +37,8 @@ exports[`ContractClass creates a contract class from a contract compilation arti "isInternal": false } ], - "id": "0x035bd6c2100ddfc79542bbeee9e8c506a3f17ee2f9dff1e25deff4a5277b5e68", + "id": "0x2ac5b620337d4d32f0f31d09de1eb89b05a8ccb2877dc7b44fe59859f434732a", "privateFunctionsRoot": "0x2dc1f38d7be98a8e72227d6f8aec393c60db813a1819c9c86b02a00cc18f6687", - "publicBytecodeCommitment": "0x19c6f3f069622a0e495b97bc2bc62989959e016b88acefecf98a2194ac1256b6" + "publicBytecodeCommitment": "0x00946ee0c98a22b53261be74dcc14f4253a81ddac129eb2196bf395593e2245f" }" `; diff --git a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap index c2721e78317..f9d915e32b5 100644 --- a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap +++ b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap @@ -2,10 +2,10 @@ exports[`GasToken returns canonical protocol contract 1`] = ` { - "address": AztecAddress<0x1ab834e6b4aaf48b35c8b39f86db61b305be30f2a7de68fe5d471d11997c3251>, + "address": AztecAddress<0x17fb417ba14d8d8c7049fc4cc0e4e19d29370737f5e18ba8c09f931d708aa0e3>, "instance": { - "address": AztecAddress<0x1ab834e6b4aaf48b35c8b39f86db61b305be30f2a7de68fe5d471d11997c3251>, - "contractClassId": Fr<0x0bb42885138b96238ca70f89755efb1317412ad9a346ba4bc01e356fd0c724a7>, + "address": AztecAddress<0x17fb417ba14d8d8c7049fc4cc0e4e19d29370737f5e18ba8c09f931d708aa0e3>, + "contractClassId": Fr<0x01b458a6e0576705fd2fd203f3d1f5a24a05b1ea38a83d4ab76118cf009bc36b>, "deployer": AztecAddress<0x0000000000000000000000000000000000000000000000000000000000000000>, "initializationHash": Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, "portalContractAddress": EthAddress<0x0000000000000000000000000000000000000000>, @@ -19,10 +19,10 @@ exports[`GasToken returns canonical protocol contract 1`] = ` exports[`GasToken returns canonical protocol contract 2`] = ` { "artifactHash": Fr<0x18af4bb0ca6fe07d0ae6da493b2c7b1af038ee904721dbba9b6e571e6d495726>, - "id": Fr<0x0bb42885138b96238ca70f89755efb1317412ad9a346ba4bc01e356fd0c724a7>, + "id": Fr<0x01b458a6e0576705fd2fd203f3d1f5a24a05b1ea38a83d4ab76118cf009bc36b>, "privateFunctions": [], "privateFunctionsRoot": Fr<0x15d28cad4c0736decea8997cb324cf0a0e0602f4d74472cd977bce2c8dd9923f>, - "publicBytecodeCommitment": Fr<0x02f8f0edea3e7909df7193c86dedfc62dc44a3057332524e49ecdee22733fb93>, + "publicBytecodeCommitment": Fr<0x272f0210ebab7596bd339c61d267c523ce43c4c3108ab1b01447415d314c6db8>, "version": 1, } `;