@aztec/protocol-contracts 0.62.0 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,2441 @@
1
- {"transpiled":true,"noir_version":"0.36.0+b0cbf84eaf69f77628939184c9b869cfb3e15846-x8664","name":"ContractInstanceDeployer","functions":[{"name":"deploy","is_unconstrained":false,"custom_attributes":["private"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"slot_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"salt","type":{"kind":"field"},"visibility":"private"},{"name":"contract_class_id","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::contract_class_id::ContractClassId"},"visibility":"private"},{"name":"initialization_hash","type":{"kind":"field"},"visibility":"private"},{"name":"public_keys","type":{"fields":[{"name":"npk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::NpkM"}},{"name":"ivpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::IvpkM"}},{"name":"ovpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::OvpkM"}},{"name":"tpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::TpkM"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::PublicKeys"},"visibility":"private"},{"name":"universal_deploy","type":{"kind":"boolean"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::public_call_request::PublicCallRequest"}}},{"name":"public_teardown_call_request","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::public_call_request::PublicCallRequest"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"slot_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"databus"}},"bytecode":"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","debug_symbols":"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","brillig_names":["decompose_hint","lte_hint","debug_log_oracle_wrapper","build_msg_block","attach_len_to_msg_block","emit_unencrypted_log_private_oracle_wrapper","directive_integer_quotient","directive_invert"]},{"name":"compute_note_hash_and_optionally_a_nullifier","is_unconstrained":true,"custom_attributes":[],"abi":{"error_types":{"14336010898202591232":{"error_kind":"fmtstring","item_types":[],"length":16}},"parameters":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"nonce","type":{"kind":"field"},"visibility":"private"},{"name":"storage_slot","type":{"kind":"field"},"visibility":"private"},{"name":"note_type_id","type":{"kind":"field"},"visibility":"private"},{"name":"compute_nullifier","type":{"kind":"boolean"},"visibility":"private"},{"name":"serialized_note","type":{"kind":"array","length":0,"type":{"kind":"field"}},"visibility":"private"}],"return_type":{"abi_type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"public"}},"bytecode":"H4sIAAAAAAAA/9VZzXLaMBCWsY2xEwiBpCU9MdNbe7ETAvTGTH/Se5+g4efSQzqdPADTQ9vHLhq0+GPZMhSvDuwMI1m7+vbTrmRJJjBraax+gavHrqybXSGbiSvzalIoYuU+eQYnwrN2IjzDE+EZKfIMBJ62jFzdrju75hKzXo87SuxsEx2C3uwBCphTK7+g3nLll+ev02/956en/mw+/74x/+PK1JU1gFPMY5Ga3dho4Y/zwTQ126LM/y51mIkf/HvCb/jBz4n3+2WJj2Mhv6ErH5ZlLB+gj5Wmq+OUI1zS1UD3gelC0H1kOpzyn5gOlwlxorjVYSyK82rsOy80tgTGFvyjNKaMHbZRrDPjdY4WlPOU8eH8iU+TbJYlnzrTRaBLmS4GHcXfln2w47lPwO4ttPM5GZrdOUx6yjnG2secijzgr2QgxZ3nJFpu+0Ydxj2CePZdvbv6fXY2OAYriWs3gBtCG2GTrwbaM10KOuRrJQP/oYBFPGJm/8Y9X7iyDn2of1vwX2f+t3gLbbiPcqxQaCN7O5dfu/qZWcf9J9mb3fWtd3YdvpPedXr4o80emvrhPyf8zAv+YIN/BviaewHhn/uJz5Dwm37wN2eYlhf82018LgDf6MW/oP2E1j/6IN+XXnJfFIfs9eg/Y1x97fWXjA+PD+4rVtcRuLYFHV+jHcFPR/BDeeiy/hOVcQ8XEtfukVwlrJYiVqqIdewYKR9XrP/EPeeVZDSQuF4pjrupiNVQxDp2nlA+rln/iXvOK8lQzMe14rg183GuiJUoYmmuW814UR6lvc7KxJV5ReFc8Q6BPmmfj5n9D8bzBfRR3JNvaU97aUrh54GeJ9+HngfIf1PgQ7wzQVfl2+d0uLh7nC0Gs8fRfJyX+ewxrrwN70T2dyPYS2cLivUr4yXWuXRfvoG4WolA12O6GHTEEe/LKcPU5n9I/NF/W9DhneZ/ctkx23MN1yO/rxqj9w6h+d4AbL42Uy/xzu8PXZvkP2Nclfns/S6H8eFn9Uzg2hZ0fO/LBD+Z4OcUsfi3bYyhXSMUp2hZ6rVyORqX/yPRuyg229/LDfMfM/vf7tknTyudPZxsnP4C4AOlGXweAAA=","debug_symbols":"tdnBaoNAEIDhd9mzB1fdnZm8SilBEw0LokFNoYjvXm1DCeT8X2RHx//2nXZ117Z53M5p6MbZnT5W14+XeknjsE/rlrlmSn2fbufX1y4/HlX1uz/f6+EY56WeFncqq8y1w3U/2P53l/r2OJZb9rYpxXNT5H8z2PaZuSpg5YiVBSsrVjaqHHKs7LFygZVLrIwZDJjBgBkMmMGAGQyYwYgZjJjBiBmMmMGIGYyYwYgZjJjBiBmMmEHBDApmUDCDghkUzKBgBgUzKJhBwQwKZlAxg4oZVMygYgYVM6iYQcUMKmZQMYOKGTTMoGEGDTNomEHDDBpm0DCDhhk0zKBhBn2ec2nPpQsuXXLpiksHLh25tHBp5dKcRs9p9JxGz2n0kMZtn77qKdVN3z4vNbrHcHm541i+739f9uUf","brillig_names":["compute_note_hash_and_optionally_a_nullifier"]}],"outputs":{"globals":{},"structs":{"events":[{"fields":[{"name":"DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE","type":{"kind":"field"}},{"name":"address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"version","type":{"kind":"integer","sign":"unsigned","width":8}},{"name":"salt","type":{"kind":"field"}},{"name":"contract_class_id","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::contract_class_id::ContractClassId"}},{"name":"initialization_hash","type":{"kind":"field"}},{"name":"public_keys","type":{"fields":[{"name":"npk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::NpkM"}},{"name":"ivpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::IvpkM"}},{"name":"ovpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::OvpkM"}},{"name":"tpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::TpkM"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::PublicKeys"}},{"name":"deployer","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::address::aztec_address::AztecAddress"}}],"kind":"struct","path":"ContractInstanceDeployer::ContractInstanceDeployed"}],"functions":[{"fields":[{"name":"parameters","type":{"fields":[{"name":"salt","type":{"kind":"field"}},{"name":"contract_class_id","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"aztec::protocol_types::contract_class_id::ContractClassId"}},{"name":"initialization_hash","type":{"kind":"field"}},{"name":"public_keys","type":{"fields":[{"name":"npk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::NpkM"}},{"name":"ivpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::IvpkM"}},{"name":"ovpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::OvpkM"}},{"name":"tpk_m","type":{"fields":[{"name":"inner","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::TpkM"}}],"kind":"struct","path":"aztec::protocol_types::public_keys::PublicKeys"}},{"name":"universal_deploy","type":{"kind":"boolean"}}],"kind":"struct","path":"ContractInstanceDeployer::deploy_parameters"}}],"kind":"struct","path":"ContractInstanceDeployer::deploy_abi"}]}},"file_map":{"148":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/utils/to_bytes.nr","source":"pub fn arr_to_be_bytes_arr<let L: u32>(fields: [Field; L]) -> [u8; L * 32] {\n let mut bytes = [0 as u8; L * 32];\n for i in 0..L {\n // Note that bytes.append() results in bound error\n let to_add: [u8; 32] = fields[i].to_be_bytes();\n for j in 0..32 {\n bytes[i * 32 + j] = to_add[j];\n }\n }\n bytes\n}\n\n// each character of a string is converted into a byte\n// then an ACVM field via the oracle => we recreate here\npub fn str_to_be_bytes_arr<let L: u32>(string: str<L>) -> [u8; L * 32] {\n let chars_bytes: [u8; L] = string.as_bytes();\n let mut bytes = [0 as u8; L * 32];\n for i in 0..L {\n let to_add: [u8; 32] = (chars_bytes[i] as Field).to_be_bytes();\n for j in 0..32 {\n bytes[i * 32 + j] = to_add[j];\n }\n }\n bytes\n}\n"},"161":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/hash.nr","source":"use crate::utils::to_bytes::{arr_to_be_bytes_arr, str_to_be_bytes_arr};\nuse dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n constants::{\n GENERATOR_INDEX__FUNCTION_ARGS, GENERATOR_INDEX__MESSAGE_NULLIFIER,\n GENERATOR_INDEX__SECRET_HASH,\n },\n hash::{poseidon2_hash_with_separator, poseidon2_hash_with_separator_slice, sha256_to_field},\n point::Point,\n traits::Hash,\n};\n\npub use dep::protocol_types::hash::{compute_siloed_nullifier, pedersen_hash};\n\npub fn pedersen_commitment<let N: u32>(inputs: [Field; N], hash_index: u32) -> Point {\n std::hash::pedersen_commitment_with_separator(inputs, hash_index)\n}\n\npub fn compute_secret_hash(secret: Field) -> Field {\n poseidon2_hash_with_separator([secret], GENERATOR_INDEX__SECRET_HASH)\n}\n\npub fn compute_unencrypted_log_hash<let N: u32>(\n contract_address: AztecAddress,\n log: [u8; N],\n) -> Field {\n let mut hash_bytes = [0; N + 36];\n // Address is converted to 32 bytes in ts\n let address_bytes: [u8; 32] = contract_address.to_field().to_be_bytes();\n for i in 0..32 {\n hash_bytes[i] = address_bytes[i];\n }\n let len_bytes: [u8; 4] = (N as Field).to_be_bytes();\n for i in 0..4 {\n hash_bytes[32 + i] = len_bytes[i];\n }\n for i in 0..N {\n hash_bytes[36 + i] = log[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\npub fn compute_l1_to_l2_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field,\n leaf_index: Field,\n) -> Field {\n let mut hash_bytes = [0 as u8; 224];\n let sender_bytes: [u8; 32] = sender.to_field().to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n let recipient_bytes: [u8; 32] = recipient.to_field().to_be_bytes();\n let version_bytes: [u8; 32] = version.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let secret_hash_bytes: [u8; 32] = secret_hash.to_be_bytes();\n let leaf_index_bytes: [u8; 32] = leaf_index.to_be_bytes();\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n hash_bytes[i + 192] = leaf_index_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret\npub fn compute_l1_to_l2_message_nullifier(message_hash: Field, secret: Field) -> Field {\n poseidon2_hash_with_separator([message_hash, secret], GENERATOR_INDEX__MESSAGE_NULLIFIER)\n}\n\npub struct ArgsHasher {\n fields: [Field],\n}\n\nimpl Hash for ArgsHasher {\n fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n\nimpl ArgsHasher {\n pub fn new() -> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<let N: u32>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n}\n\npub fn hash_args_array<let N: u32>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\npub fn hash_args(args: [Field]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator_slice(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n#[test]\nunconstrained fn compute_var_args_hash() {\n let mut input = ArgsHasher::new();\n for i in 0..100 {\n input.add(i as Field);\n }\n let hash = input.hash();\n dep::std::println(hash);\n assert(hash == 0x19b0d74feb06ebde19edd85a28986c97063e84b3b351a8b666c7cac963ce655f);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(\n 0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6,\n );\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd,\n ];\n let serialized_log = arr_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(\n 0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6,\n );\n let log = AztecAddress::from_field(\n 0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303,\n );\n let serialized_log: [u8; 32] = log.to_field().to_be_bytes();\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(\n 0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8,\n );\n let log = \"dummy\";\n let serialized_log = str_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(\n 0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8,\n );\n let log = \"Hello this is a string\";\n let serialized_log = str_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841);\n}\n"},"186":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr","source":"use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\n hash::{ArgsHasher, hash_args_array},\n keys::constants::{NULLIFIER_INDEX, NUM_KEY_TYPES, OUTGOING_INDEX, sk_generators},\n messaging::process_l1_to_l2_message,\n oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, notify_set_min_revertible_side_effect_counter,\n set_public_teardown_function_call_internal,\n },\n header::get_header_at,\n key_validation_request::get_key_validation_request,\n logs::{emit_encrypted_event_log, emit_encrypted_note_log},\n returns::pack_returns,\n },\n};\nuse dep::protocol_types::{\n abis::{\n call_context::CallContext,\n function_selector::FunctionSelector,\n log_hash::{EncryptedLogHash, LogHash, NoteLogHash},\n max_block_number::MaxBlockNumber,\n note_hash::NoteHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_request::PublicCallRequest,\n read_request::ReadRequest,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n },\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_ENCRYPTED_LOGS_PER_CALL, MAX_KEY_VALIDATION_REQUESTS_PER_CALL,\n MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL,\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NOTE_HASHES_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_UNENCRYPTED_LOGS_PER_CALL, PUBLIC_DISPATCH_SELECTOR,\n },\n header::Header,\n messaging::l2_to_l1_message::L2ToL1Message,\n traits::Empty,\n};\n\n// When finished, one can call .finish() to convert back to the abi\npub struct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n args_hash: Field,\n return_hash: Field,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n nullifier_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n key_validation_requests_and_generators: BoundedVec<KeyValidationRequestAndGenerator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL>,\n\n note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n private_call_requests: BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_requests: BoundedVec<PublicCallRequest, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n public_teardown_call_request: PublicCallRequest,\n l2_to_l1_msgs: BoundedVec<L2ToL1Message, MAX_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_LOGS_PER_CALL>,\n unencrypted_logs_hashes: BoundedVec<LogHash, MAX_UNENCRYPTED_LOGS_PER_CALL>,\n\n // Contains the last key validation request for each key type. This is used to cache the last request and avoid\n // fetching the same request multiple times.\n // The index of the array corresponds to the key type (0 nullifier, 1 incoming, 2 outgoing, 3 tagging).\n last_key_validation_requests: [Option<KeyValidationRequest>; NUM_KEY_TYPES],\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n historical_header: inputs.historical_header,\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n\n fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> AztecAddress {\n self.inputs.call_context.contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n }\n\n fn push_nullifier(&mut self, nullifier: Field) {\n self.nullifiers.push(\n Nullifier { value: nullifier, note_hash: 0, counter: self.next_counter() },\n );\n }\n\n fn push_nullifier_for_note_hash(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.nullifiers.push(\n Nullifier {\n value: nullifier,\n note_hash: nullified_note_hash,\n counter: self.next_counter(),\n },\n );\n }\n\n // Returns the header of a block whose state is used during private execution (not the block the transaction is\n // included in).\n fn get_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage,\n nullifier_read_requests: self.nullifier_read_requests.storage,\n key_validation_requests_and_generators: self\n .key_validation_requests_and_generators\n .storage,\n note_hashes: self.note_hashes.storage,\n nullifiers: self.nullifiers.storage,\n private_call_requests: self.private_call_requests.storage,\n public_call_requests: self.public_call_requests.storage,\n public_teardown_call_request: self.public_teardown_call_request,\n l2_to_l1_msgs: self.l2_to_l1_msgs.storage,\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage,\n encrypted_logs_hashes: self.encrypted_logs_hashes.storage,\n unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage,\n historical_header: self.historical_header,\n tx_context: self.inputs.tx_context,\n }\n }\n\n pub fn set_as_fee_payer(&mut self) {\n dep::protocol_types::debug_log::debug_log_format(\n \"Setting {0} as fee payer\",\n [self.this_address().to_field()],\n );\n self.is_fee_payer = true;\n }\n\n pub fn end_setup(&mut self) {\n // dep::protocol_types::debug_log::debug_log_format(\n // \"Ending setup at counter {0}\",\n // [self.side_effect_counter as Field]\n // );\n self.min_revertible_side_effect_counter = self.side_effect_counter;\n notify_set_min_revertible_side_effect_counter(self.min_revertible_side_effect_counter);\n }\n\n // docs:start:max-block-number\n pub fn set_tx_max_block_number(&mut self, max_block_number: u32) {\n // docs:end:max-block-number\n self.max_block_number =\n MaxBlockNumber::min_with_u32(self.max_block_number, max_block_number);\n }\n\n pub fn push_note_hash_read_request(&mut self, note_hash: Field) {\n let side_effect = ReadRequest { value: note_hash, counter: self.next_counter() };\n self.note_hash_read_requests.push(side_effect);\n }\n\n pub fn push_nullifier_read_request(&mut self, nullifier: Field) {\n let request = ReadRequest { value: nullifier, counter: self.next_counter() };\n self.nullifier_read_requests.push(request);\n }\n\n pub fn request_nsk_app(&mut self, npk_m_hash: Field) -> Field {\n self.request_sk_app(npk_m_hash, NULLIFIER_INDEX)\n }\n\n pub fn request_ovsk_app(&mut self, ovpk_m_hash: Field) -> Field {\n self.request_sk_app(ovpk_m_hash, OUTGOING_INDEX)\n }\n\n fn request_sk_app(&mut self, pk_m_hash: Field, key_index: Field) -> Field {\n let cached_request =\n self.last_key_validation_requests[key_index].unwrap_or(KeyValidationRequest::empty());\n\n if cached_request.pk_m.hash() == pk_m_hash {\n // We get a match so the cached request is the latest one\n cached_request.sk_app\n } else {\n // We didn't get a match meaning the cached result is stale. We fetch new values from oracle and instruct\n // protocol circuits to validate them by storing the validation request in context.\n let request = get_key_validation_request(pk_m_hash, key_index);\n let request_and_generator = KeyValidationRequestAndGenerator {\n request,\n sk_app_generator: sk_generators[key_index],\n };\n // We constrain that the pk_m_hash matches the one in the request (otherwise we could get an arbitrary\n // valid key request and not the one corresponding to pk_m_hash).\n assert(request.pk_m.hash() == pk_m_hash);\n self.key_validation_requests_and_generators.push(request_and_generator);\n self.last_key_validation_requests[key_index] = Option::some(request);\n request.sk_app\n }\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n // docs:end:context_message_portal\n let message = L2ToL1Message { recipient, content, counter: self.next_counter() };\n self.l2_to_l1_msgs.push(message);\n }\n\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\n // docs:end:context_consume_l1_to_l2_message\n let nullifier = process_l1_to_l2_message(\n self.historical_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret,\n leaf_index,\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n // docs:end:consume_l1_to_l2_message\n\n // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<let M: u32>(\n &mut self,\n randomness: Field,\n log: [u8; M],\n log_hash: Field,\n ) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<let M: u32>(\n &mut self,\n note_hash_counter: u32,\n log: [u8; M],\n log_hash: Field,\n ) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn static_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false)\n }\n\n pub fn static_call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> PackedReturns {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n let (end_side_effect_counter, returns_hash) = call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n );\n\n self.side_effect_counter = end_side_effect_counter + 1;\n\n // TODO (fees) figure out why this crashes the prover and enable it\n // we need this in order to pay fees inside child call contexts\n // assert(\n // (item.public_inputs.min_revertible_side_effect_counter == 0 as u32)\n // | (item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter)\n // );\n // if item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter {\n // self.min_revertible_side_effect_counter = item.public_inputs.min_revertible_side_effect_counter;\n // }\n let call_context = CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n };\n\n self.private_call_requests.push(\n PrivateCallRequest {\n call_context,\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter,\n },\n );\n\n PackedReturns::new(returns_hash)\n }\n\n pub fn call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn static_call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false)\n }\n\n pub fn static_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n );\n\n // Public calls are rerouted through the dispatch function.\n let function_selector = comptime { FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR) };\n let call_context = CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n };\n\n let call_request = PublicCallRequest { call_context, args_hash, counter };\n self.public_call_requests.push(call_request);\n }\n\n pub fn set_public_teardown_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.set_public_teardown_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn set_public_teardown_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n );\n\n let function_selector = comptime { FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR) };\n let call_context = CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n };\n\n self.public_teardown_call_request = PublicCallRequest { call_context, args_hash, counter };\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n}\n"},"24":{"path":"std/embedded_curve_ops.nr","source":"use crate::cmp::Eq;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul<let N: u32>(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n let point_array = multi_scalar_mul_array_return(points, scalars);\n EmbeddedCurvePoint { x: point_array[0], y: point_array[1], is_infinite: point_array[2] as bool }\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return<let N: u32>(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [Field; 3] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n let g1 = EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860,\n is_infinite: false,\n };\n multi_scalar_mul([g1], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// This is a hack because returning an `EmbeddedCurvePoint` from a foreign function in brillig returns a [BrilligVariable::SingleAddr; 2] rather than BrilligVariable::BrilligArray\n// as is defined in the brillig bytecode format. This is a workaround which allows us to fix this without modifying the serialization format.\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n let x_coordinates_match = point1.x == point2.x;\n let y_coordinates_match = point1.y == point2.y;\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n result.is_infinite = x_coordinates_match;\n\n // dbl if x_match, y_match\n let double = embedded_curve_add_unsafe(point1, point1);\n result = if double_predicate { double } else { result };\n\n // infinity if x_match, !y_match\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n let mut result_is_infinity = infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [Field; 3] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n let point_array = embedded_curve_add_array_return(point1, point2);\n let x = point_array[0];\n let y = point_array[1];\n\n EmbeddedCurvePoint { x, y, is_infinite: false }\n}\n"},"25":{"path":"std/field/bn254.nr","source":"use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\nglobal TWO_POW_64: Field = 0x10000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(mut x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 64 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low_lower_64 = (x as u64) as Field;\n x = (x - low_lower_64) / TWO_POW_64;\n let low_upper_64 = (x as u64) as Field;\n\n let high = (x - low_upper_64) / TWO_POW_64;\n let low = low_upper_64 * TWO_POW_64 + low_lower_64;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(unsafe { field_less_than(b, a) });\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n"},"26":{"path":"std/field/mod.nr","source":"pub mod bn254;\nuse crate::runtime::is_unconstrained;\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size<let BIT_SIZE: u32>(self) {\n // docs:end:assert_max_bit_size\n assert(BIT_SIZE < modulus_num_bits() as u32);\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n // docs:start:to_le_bits\n pub fn to_le_bits<let N: u32>(self: Self) -> [u1; N] {}\n // docs:end:to_le_bits\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n // docs:start:to_be_bits\n pub fn to_be_bits<let N: u32>(self: Self) -> [u1; N] {}\n // docs:end:to_be_bits\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes<let N: u32>(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes<let N: u32>(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix<let N: u32>(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix<let N: u32>(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix<let N: u32>(self, radix: u32) -> [u8; N] {}\n\n #[builtin(to_be_radix)]\n fn __to_be_radix<let N: u32>(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes<let N: u32>(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes<let N: u32>(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bits: [u8; 8] = field.to_be_bytes();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bits), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bits: [u8; 8] = field.to_le_bytes();\n assert_eq(bits, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bits), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n let field = 2;\n let bits: [u8; 8] = field.to_be_radix(256);\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bits), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n let field = 2;\n let bits: [u8; 8] = field.to_le_radix(256);\n assert_eq(bits, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bits), field);\n }\n // docs:end:to_le_radix_example\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n"},"315":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/partial_address.nr","source":"use crate::{\n address::{aztec_address::AztecAddress, salted_initialization_hash::SaltedInitializationHash},\n constants::GENERATOR_INDEX__PARTIAL_ADDRESS,\n contract_class_id::ContractClassId,\n hash::poseidon2_hash_with_separator,\n traits::{Deserialize, Serialize, ToField},\n};\n\nglobal PARTIAL_ADDRESS_LENGTH: u32 = 1;\n\n// Partial address\npub struct PartialAddress {\n inner: Field,\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn serialize(self: Self) -> [Field; PARTIAL_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn deserialize(fields: [Field; PARTIAL_ADDRESS_LENGTH]) -> Self {\n PartialAddress { inner: fields[0] }\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(\n contract_class_id: ContractClassId,\n salt: Field,\n initialization_hash: Field,\n deployer: AztecAddress,\n ) -> Self {\n PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n SaltedInitializationHash::compute(salt, initialization_hash, deployer),\n )\n }\n\n pub fn compute_from_salted_initialization_hash(\n contract_class_id: ContractClassId,\n salted_initialization_hash: SaltedInitializationHash,\n ) -> Self {\n PartialAddress::from_field(poseidon2_hash_with_separator(\n [contract_class_id.to_field(), salted_initialization_hash.to_field()],\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n ))\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn is_zero(self) -> bool {\n self.to_field() == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"316":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/salted_initialization_hash.nr","source":"use crate::{\n address::aztec_address::AztecAddress, constants::GENERATOR_INDEX__PARTIAL_ADDRESS,\n hash::poseidon2_hash_with_separator, traits::ToField,\n};\n\n// Salted initialization hash. Used in the computation of a partial address.\npub struct SaltedInitializationHash {\n inner: Field,\n}\n\nimpl ToField for SaltedInitializationHash {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl SaltedInitializationHash {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(salt: Field, initialization_hash: Field, deployer: AztecAddress) -> Self {\n SaltedInitializationHash::from_field(poseidon2_hash_with_separator(\n [salt, initialization_hash, deployer.to_field()],\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n ))\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"319":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr","source":"use crate::{\n abis::function_selector::FunctionSelector,\n address::{\n partial_address::PartialAddress, public_keys_hash::PublicKeysHash,\n salted_initialization_hash::SaltedInitializationHash,\n },\n constants::{\n AZTEC_ADDRESS_LENGTH, FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__CONTRACT_ADDRESS_V1,\n GENERATOR_INDEX__PUBLIC_KEYS_HASH, MAX_FIELD_VALUE,\n },\n contract_class_id::ContractClassId,\n hash::{poseidon2_hash_with_separator, private_functions_root_from_siblings},\n merkle_tree::membership::MembershipWitness,\n public_keys::{IvpkM, NpkM, OvpkM, PublicKeys, ToPoint, TpkM},\n traits::{Deserialize, Empty, FromField, Serialize, ToField},\n utils,\n};\n\n// We do below because `use crate::point::Point;` does not work\nuse dep::std::embedded_curve_ops::EmbeddedCurvePoint as Point;\n\nuse crate::public_keys::AddressPoint;\nuse std::{\n ec::{pow, sqrt},\n embedded_curve_ops::{EmbeddedCurveScalar, fixed_base_scalar_mul as derive_public_key},\n};\n\n// Aztec address\npub struct AztecAddress {\n inner: Field,\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other: Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn to_address_point(self) -> AddressPoint {\n // We compute the address point by taking our address, setting it to x, and then solving for y in the\n // equation which defines our bn curve:\n // y^2 = x^3 - 17; x = address\n let x = self.inner;\n let y_squared = pow(x, 3) - 17;\n\n // TODO (#8970): Handle cases where we cannot recover a point from an address\n let mut y = sqrt(y_squared);\n\n // If we get a negative y coordinate (any y where y > MAX_FIELD_VALUE / 2), we pin it to the\n // positive one (any value where y <= MAX_FIELD_VALUE / 2) by subtracting it from the Field modulus\n // note: The field modulus is MAX_FIELD_VALUE + 1\n if (!(y.lt(MAX_FIELD_VALUE / 2) | y.eq(MAX_FIELD_VALUE / 2))) {\n y = (MAX_FIELD_VALUE + 1) - y;\n }\n\n AddressPoint { inner: Point { x: self.inner, y, is_infinite: false } }\n }\n\n pub fn compute(public_keys: PublicKeys, partial_address: PartialAddress) -> AztecAddress {\n let public_keys_hash = public_keys.hash();\n\n let pre_address = poseidon2_hash_with_separator(\n [public_keys_hash.to_field(), partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS_V1,\n );\n\n let address_point = derive_public_key(EmbeddedCurveScalar::from_field(pre_address)).add(\n public_keys.ivpk_m.to_point(),\n );\n\n // Note that our address is only the x-coordinate of the full address_point. This is okay because when people want to encrypt something and send it to us\n // they can recover our full point using the x-coordinate (our address itself). To do this, they recompute the y-coordinate according to the equation y^2 = x^3 - 17.\n // When they do this, they may get a positive y-coordinate (a value that is less than or equal to MAX_FIELD_VALUE / 2) or\n // a negative y-coordinate (a value that is more than MAX_FIELD_VALUE), and we cannot dictate which one they get and hence the recovered point may sometimes be different than the one\n // our secrect can decrypt. Regardless though, they should and will always encrypt using point with the positive y-coordinate by convention.\n // This ensures that everyone encrypts to the same point given an arbitrary x-coordinate (address). This is allowed because even though our original point may not have a positive y-coordinate,\n // with our original secret, we will be able to derive the secret to the point with the flipped (and now positive) y-coordinate that everyone encrypts to.\n AztecAddress::from_field(address_point.x)\n }\n\n pub fn compute_from_private_function(\n function_selector: FunctionSelector,\n functino_vk_hash: Field,\n function_leaf_membership_witness: MembershipWitness<FUNCTION_TREE_HEIGHT>,\n contract_class_artifact_hash: Field,\n contract_class_public_bytecode_commitment: Field,\n salted_initialization_hash: SaltedInitializationHash,\n public_keys: PublicKeys,\n ) -> Self {\n let private_functions_root = private_functions_root_from_siblings(\n function_selector,\n functino_vk_hash,\n function_leaf_membership_witness.leaf_index,\n function_leaf_membership_witness.sibling_path,\n );\n\n let contract_class_id = ContractClassId::compute(\n contract_class_artifact_hash,\n private_functions_root,\n contract_class_public_bytecode_commitment,\n );\n\n // Compute contract address using the preimage which includes the class_id.\n let partial_address = PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n salted_initialization_hash,\n );\n\n AztecAddress::compute(public_keys, partial_address)\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys() {\n let public_keys = PublicKeys {\n npk_m: NpkM {\n inner: Point {\n x: 0x22f7fcddfa3ce3e8f0cc8e82d7b94cdd740afa3e77f8e4a63ea78a239432dcab,\n y: 0x0471657de2b6216ade6c506d28fbc22ba8b8ed95c871ad9f3e3984e90d9723a7,\n is_infinite: false,\n },\n },\n ivpk_m: IvpkM {\n inner: Point {\n x: 0x111223493147f6785514b1c195bb37a2589f22a6596d30bb2bb145fdc9ca8f1e,\n y: 0x273bbffd678edce8fe30e0deafc4f66d58357c06fd4a820285294b9746c3be95,\n is_infinite: false,\n },\n },\n ovpk_m: OvpkM {\n inner: Point {\n x: 0x09115c96e962322ffed6522f57194627136b8d03ac7469109707f5e44190c484,\n y: 0x0c49773308a13d740a7f0d4f0e6163b02c5a408b6f965856b6a491002d073d5b,\n is_infinite: false,\n },\n },\n tpk_m: TpkM {\n inner: Point {\n x: 0x00d3d81beb009873eb7116327cf47c612d5758ef083d4fda78e9b63980b2a762,\n y: 0x2f567d22d2b02fe1f4ad42db9d58a36afd1983e7e2909d1cab61cafedad6193a,\n is_infinite: false,\n },\n },\n };\n\n let partial_address = PartialAddress::from_field(\n 0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de,\n );\n\n let address = AztecAddress::compute(public_keys, partial_address);\n\n // The following value was generated by `derivation.test.ts`.\n // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data.\n let expected_computed_address_from_partial_and_pubkeys =\n 0x24e4646f58b9fbe7d38e317db8d5636c423fbbdfbe119fc190fe9c64747e0c62;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkeys);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"},"320":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr","source":"/// Utility function to console.log data in the acir simulator.\n/// Example:\n/// debug_log(\"blah blah this is a debug string\");\npub fn debug_log<let N: u32>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n\n/// Utility function to console.log data in the acir simulator. This variant receives a format string in which the\n/// `${k}` tokens will be replaced with the k-eth value in the `args` array.\n/// Examples:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole array: {}\", [e1, e2, e3, e4]);\npub fn debug_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe { debug_log_oracle_wrapper(msg, args) };\n}\n\npub unconstrained fn debug_log_oracle_wrapper<let M: u32, let N: u32>(\n msg: str<M>,\n args: [Field; N],\n) {\n debug_log_oracle(msg, args.as_slice());\n}\n\n// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: \"solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155\"`\n#[oracle(debugLog)]\nunconstrained fn debug_log_oracle<let M: u32>(_msg: str<M>, args: [Field]) {}\n"},"328":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr","source":"use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector,\n log_hash::{LogHash, ScopedEncryptedLogHash, ScopedLogHash},\n note_hash::ScopedNoteHash,\n nullifier::ScopedNullifier,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__UNIQUE_NOTE_HASH, GENERATOR_INDEX__VK,\n MAX_ENCRYPTED_LOGS_PER_TX, MAX_NOTE_ENCRYPTED_LOGS_PER_TX,\n },\n merkle_tree::root::root_from_sibling_path,\n messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message},\n proof::verification_key::VerificationKey,\n traits::{is_empty, ToField},\n utils::field::field_from_bytes_32_trunc,\n};\nuse super::utils::field::field_from_bytes;\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = std::hash::sha256(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\nfn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field {\n // Hashing tx hash with note index in tx is guaranteed to be unique\n poseidon2_hash_with_separator(\n [tx_hash, note_index_in_tx as Field],\n GENERATOR_INDEX__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, note_hash: Field) -> Field {\n let inputs = [nonce, note_hash];\n poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), unique_note_hash],\n GENERATOR_INDEX__SILOED_NOTE_HASH,\n )\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: ScopedNoteHash, tx_hash: Field, note_index_in_tx: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx);\n let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value());\n compute_siloed_note_hash(note_hash.contract_address, unique_note_hash)\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), nullifier],\n GENERATOR_INDEX__OUTER_NULLIFIER,\n )\n}\n\npub fn silo_nullifier(nullifier: ScopedNullifier) -> Field {\n if nullifier.contract_address.is_zero() {\n nullifier.value() // Return value instead of 0 because the first nullifier's contract address is zero.\n } else {\n compute_siloed_nullifier(nullifier.contract_address, nullifier.value())\n }\n}\n\npub fn silo_encrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n // We assume contract address has already been masked\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n accumulate_sha256(\n [log_hash.contract_address.to_field(), log_hash.log_hash.value],\n )\n }\n}\n\npub fn mask_encrypted_log_hash(scoped_log: ScopedEncryptedLogHash) -> AztecAddress {\n if scoped_log.contract_address.is_zero() {\n AztecAddress::from_field(0)\n } else if (scoped_log.log_hash.randomness == 0) {\n scoped_log.contract_address\n } else {\n AztecAddress::from_field(poseidon2_hash_with_separator(\n [scoped_log.contract_address.to_field(), scoped_log.log_hash.randomness],\n 0,\n ))\n }\n}\n\nfn compute_siloed_unencrypted_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_unencrypted_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk<let N: u32>(\n _vk: VerificationKey<N>,\n) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs =\n [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes: [u8; 32] = inputs[i].to_be_bytes();\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn silo_l2_to_l1_message(\n msg: ScopedL2ToL1Message,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.message.recipient,\n msg.message.content,\n rollup_version_id,\n chain_id,\n )\n }\n}\n\n// Computes sha256 hash of 2 input hashes.\n//\n// NB: This method now takes in two 31 byte fields - it assumes that any input\n// is the result of a sha_to_field hash and => is truncated\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\npub fn accumulate_sha256(input: [Field; 2]) -> Field {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually\n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field\n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n // Concatentate two fields into 32x2 = 64 bytes\n // accumulate_sha256 assumes that the inputs are pre-truncated 31 byte numbers\n let mut hash_input_flattened = [0; 64];\n for offset in 0..input.len() {\n let input_as_bytes: [u8; 32] = input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n sha256_to_field(hash_input_flattened)\n}\n\n// Computes the final logs hash for a tx.\n// NB: this assumes MAX_ENCRYPTED_LOGS_PER_TX == MAX_UNENCRYPTED_LOGS_PER_TX\n// to avoid doubling code, since we can't define the byte len to be 32*N directly.\npub fn compute_tx_logs_hash(logs: [LogHash; MAX_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_ENCRYPTED_LOGS_PER_TX {\n // TODO: This is not checking that the decomposition is smaller than P\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_radix(256);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn compute_tx_note_logs_hash(logs: [LogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_NOTE_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_NOTE_ENCRYPTED_LOGS_PER_TX {\n // TODO: This is not checking that the decomposition is smaller than P\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_radix(256);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn verification_key_hash<let N: u32>(key: [Field; N]) -> Field {\n crate::hash::poseidon2_hash(key)\n}\n\n#[inline_always]\npub fn pedersen_hash<let N: u32>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of N + 1\n let in_len = N + 1;\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\npub fn poseidon2_hash_with_separator_slice<T>(inputs: [Field], separator: T) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of Math.ceil(N/31)\n let mut in_len = N / 31;\n let mut has_padding = false;\n if N % 31 != 0 {\n in_len += 1;\n has_padding = true;\n }\n\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n sponge.absorb(field_from_bytes(current_field, false));\n current_field = [0; 31];\n }\n }\n if has_padding {\n sponge.absorb(field_from_bytes(current_field, false));\n }\n\n sponge.squeeze()\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = std::hash::sha256(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result =\n compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(\n AztecAddress::from_field(1),\n EthAddress::from_field(3),\n 5,\n 2,\n 4,\n );\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n ScopedL2ToL1Message {\n message: L2ToL1Message { recipient: EthAddress::from_field(1), content: 2, counter: 0 },\n contract_address: AztecAddress::from_field(3),\n },\n version,\n chainId,\n );\n\n // The following value was generated by `l2_to_l1_message.test.ts`\n let hash_from_typescript = 0x00c6155d69febb9d5039b374dd4f77bf57b7c881709aa524a18acaa0bd57476a;\n\n assert_eq(hash, hash_from_typescript);\n}\n"},"330":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/public_keys.nr","source":"use crate::{\n address::public_keys_hash::PublicKeysHash,\n constants::{\n DEFAULT_IVPK_M_X, DEFAULT_IVPK_M_Y, DEFAULT_NPK_M_X, DEFAULT_NPK_M_Y, DEFAULT_OVPK_M_X,\n DEFAULT_OVPK_M_Y, DEFAULT_TPK_M_X, DEFAULT_TPK_M_Y, GENERATOR_INDEX__PUBLIC_KEYS_HASH,\n },\n hash::poseidon2_hash_with_separator,\n point::POINT_LENGTH,\n traits::{Deserialize, Hash, Serialize},\n};\n\nuse dep::std::embedded_curve_ops::EmbeddedCurvePoint as Point;\nuse dep::std::embedded_curve_ops::fixed_base_scalar_mul as derive_public_key;\nuse std::default::Default;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\npub global PUBLIC_KEYS_LENGTH: u32 = 12;\n\npub struct PublicKeys {\n npk_m: NpkM,\n ivpk_m: IvpkM,\n ovpk_m: OvpkM,\n tpk_m: TpkM,\n}\n\npub trait ToPoint {\n fn to_point(self) -> Point;\n}\n\npub struct NpkM {\n inner: Point,\n}\n\nimpl ToPoint for NpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for NpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\n// Note: If we store npk_m_hash directly we can remove this trait implementation. See #8091\nimpl Hash for NpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\npub struct IvpkM {\n inner: Point,\n}\n\nimpl ToPoint for IvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for IvpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\npub struct OvpkM {\n inner: Point,\n}\n\nimpl Hash for OvpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\nimpl ToPoint for OvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for OvpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\npub struct TpkM {\n inner: Point,\n}\n\nimpl ToPoint for TpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for TpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\nimpl Default for PublicKeys {\n fn default() -> Self {\n PublicKeys {\n npk_m: NpkM {\n inner: Point { x: DEFAULT_NPK_M_X, y: DEFAULT_NPK_M_Y, is_infinite: false },\n },\n ivpk_m: IvpkM {\n inner: Point { x: DEFAULT_IVPK_M_X, y: DEFAULT_IVPK_M_Y, is_infinite: false },\n },\n ovpk_m: OvpkM {\n inner: Point { x: DEFAULT_OVPK_M_X, y: DEFAULT_OVPK_M_Y, is_infinite: false },\n },\n tpk_m: TpkM {\n inner: Point { x: DEFAULT_TPK_M_X, y: DEFAULT_TPK_M_Y, is_infinite: false },\n },\n }\n }\n}\n\nimpl Eq for PublicKeys {\n fn eq(self, other: PublicKeys) -> bool {\n (self.npk_m.inner == other.npk_m.inner)\n & (self.ivpk_m.inner == other.ivpk_m.inner)\n & (self.ovpk_m.inner == other.ovpk_m.inner)\n & (self.tpk_m.inner == other.tpk_m.inner)\n }\n}\n\nimpl PublicKeys {\n pub fn hash(self) -> PublicKeysHash {\n PublicKeysHash::from_field(poseidon2_hash_with_separator(\n self.serialize(),\n GENERATOR_INDEX__PUBLIC_KEYS_HASH as Field,\n ))\n }\n}\n\nimpl Serialize<PUBLIC_KEYS_LENGTH> for PublicKeys {\n fn serialize(self) -> [Field; PUBLIC_KEYS_LENGTH] {\n [\n self.npk_m.inner.x,\n self.npk_m.inner.y,\n self.npk_m.inner.is_infinite as Field,\n self.ivpk_m.inner.x,\n self.ivpk_m.inner.y,\n self.ivpk_m.inner.is_infinite as Field,\n self.ovpk_m.inner.x,\n self.ovpk_m.inner.y,\n self.ovpk_m.inner.is_infinite as Field,\n self.tpk_m.inner.x,\n self.tpk_m.inner.y,\n self.tpk_m.inner.is_infinite as Field,\n ]\n }\n}\n\nimpl Deserialize<PUBLIC_KEYS_LENGTH> for PublicKeys {\n fn deserialize(serialized: [Field; PUBLIC_KEYS_LENGTH]) -> PublicKeys {\n PublicKeys {\n npk_m: NpkM {\n inner: Point {\n x: serialized[0],\n y: serialized[1],\n is_infinite: serialized[2] as bool,\n },\n },\n ivpk_m: IvpkM {\n inner: Point {\n x: serialized[3],\n y: serialized[4],\n is_infinite: serialized[5] as bool,\n },\n },\n ovpk_m: OvpkM {\n inner: Point {\n x: serialized[6],\n y: serialized[7],\n is_infinite: serialized[8] as bool,\n },\n },\n tpk_m: TpkM {\n inner: Point {\n x: serialized[9],\n y: serialized[10],\n is_infinite: serialized[11] as bool,\n },\n },\n }\n }\n}\n\npub struct AddressPoint {\n inner: Point,\n}\n\nimpl ToPoint for AddressPoint {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[test]\nunconstrained fn compute_public_keys_hash() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let actual = keys.hash();\n let expected_public_keys_hash =\n 0x0fecd9a32db731fec1fded1b9ff957a1625c069245a3613a2538bd527068b0ad;\n\n assert(actual.to_field() == expected_public_keys_hash);\n}\n\n#[test]\nunconstrained fn compute_default_hash() {\n let keys = PublicKeys::default();\n\n let actual = keys.hash();\n let test_data_default_hash = 0x1d3bf1fb93ae0e9cda83b203dd91c3bfb492a9aecf30ec90e1057eced0f0e62d;\n\n assert(actual.to_field() == test_data_default_hash);\n}\n\n#[test]\nunconstrained fn test_public_keys_serialization() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let serialized = keys.serialize();\n let deserialized = PublicKeys::deserialize(serialized);\n\n assert_eq(keys.npk_m.inner.x, deserialized.npk_m.inner.x);\n assert_eq(keys.npk_m.inner.y, deserialized.npk_m.inner.y);\n assert_eq(keys.ivpk_m.inner.x, deserialized.ivpk_m.inner.x);\n assert_eq(keys.ivpk_m.inner.y, deserialized.ivpk_m.inner.y);\n assert_eq(keys.ovpk_m.inner.x, deserialized.ovpk_m.inner.x);\n assert_eq(keys.ovpk_m.inner.y, deserialized.ovpk_m.inner.y);\n assert_eq(keys.tpk_m.inner.x, deserialized.tpk_m.inner.x);\n assert_eq(keys.tpk_m.inner.y, deserialized.tpk_m.inner.y);\n}\n"},"34":{"path":"std/hash/poseidon2.nr","source":"use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n if message_size == N {\n Poseidon2::hash_internal(input, N, false)\n } else {\n Poseidon2::hash_internal(input, message_size, true)\n }\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal<let N: u32>(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n"},"35":{"path":"std/hash/sha256.nr","source":"use crate::runtime::is_unconstrained;\n\n// Implementation of SHA-256 mapping a byte array of variable length to\n// 32 bytes.\n\n// A message block is up to 64 bytes taken from the input.\nglobal BLOCK_SIZE = 64;\n\n// The first index in the block where the 8 byte message size will be written.\nglobal MSG_SIZE_PTR = 56;\n\n// Size of the message block when packed as 4-byte integer array.\nglobal INT_BLOCK_SIZE = 16;\n\n// A `u32` integer consists of 4 bytes.\nglobal INT_SIZE = 4;\n\n// Index of the integer in the `INT_BLOCK` where the length is written.\nglobal INT_SIZE_PTR = MSG_SIZE_PTR / INT_SIZE;\n\n// Magic numbers for bit shifting.\n// Works with actual bit shifting as well as the compiler turns them into * and /\n// but circuit execution appears to be 10% faster this way.\nglobal TWO_POW_8 = 256;\nglobal TWO_POW_16 = TWO_POW_8 * 256;\nglobal TWO_POW_24 = TWO_POW_16 * 256;\nglobal TWO_POW_32 = TWO_POW_24 as u64 * 256;\n\n// Index of a byte in a 64 byte block; ie. 0..=63\ntype BLOCK_BYTE_PTR = u32;\n\n// The foreign function to compress blocks works on 16 pieces of 4-byte integers, instead of 64 bytes.\ntype INT_BLOCK = [u32; INT_BLOCK_SIZE];\n\n// A message block is a slice of the original message of a fixed size,\n// potentially padded with zeros, with neighbouring 4 bytes packed into integers.\ntype MSG_BLOCK = INT_BLOCK;\n\n// The hash is 32 bytes.\ntype HASH = [u8; 32];\n\n// The state accumulates the blocks.\n// Its overall size is the same as the `HASH`.\ntype STATE = [u32; 8];\n\n// Deprecated in favour of `sha256_var`\n// docs:start:sha256\npub fn sha256<let N: u32>(input: [u8; N]) -> HASH\n// docs:end:sha256\n{\n digest(input)\n}\n\n#[foreign(sha256_compression)]\npub fn sha256_compression(_input: INT_BLOCK, _state: STATE) -> STATE {}\n\n// SHA-256 hash function\n#[no_predicates]\npub fn digest<let N: u32>(msg: [u8; N]) -> HASH {\n sha256_var(msg, N as u64)\n}\n\n// Variable size SHA-256 hash\npub fn sha256_var<let N: u32>(msg: [u8; N], message_size: u64) -> HASH {\n let message_size = message_size as u32;\n let num_blocks = N / BLOCK_SIZE;\n let mut msg_block: MSG_BLOCK = [0; INT_BLOCK_SIZE];\n // Intermediate hash, starting with the canonical initial value\n let mut h: STATE = [\n 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635,\n 1541459225,\n ];\n // Pointer into msg_block on a 64 byte scale\n let mut msg_byte_ptr = 0;\n for i in 0..num_blocks {\n let msg_start = BLOCK_SIZE * i;\n let (new_msg_block, new_msg_byte_ptr) =\n unsafe { build_msg_block(msg, message_size, msg_start) };\n\n if msg_start < message_size {\n msg_block = new_msg_block;\n }\n\n if !is_unconstrained() {\n // Verify the block we are compressing was appropriately constructed\n let new_msg_byte_ptr = verify_msg_block(msg, message_size, msg_block, msg_start);\n if msg_start < message_size {\n msg_byte_ptr = new_msg_byte_ptr;\n }\n } else if msg_start < message_size {\n msg_byte_ptr = new_msg_byte_ptr;\n }\n\n // If the block is filled, compress it.\n // An un-filled block is handled after this loop.\n if (msg_start < message_size) & (msg_byte_ptr == BLOCK_SIZE) {\n h = sha256_compression(msg_block, h);\n }\n }\n\n let modulo = N % BLOCK_SIZE;\n // Handle setup of the final msg block.\n // This case is only hit if the msg is less than the block size,\n // or our message cannot be evenly split into blocks.\n if modulo != 0 {\n let msg_start = BLOCK_SIZE * num_blocks;\n let (new_msg_block, new_msg_byte_ptr) =\n unsafe { build_msg_block(msg, message_size, msg_start) };\n\n if msg_start < message_size {\n msg_block = new_msg_block;\n }\n\n if !is_unconstrained() {\n let new_msg_byte_ptr = verify_msg_block(msg, message_size, msg_block, msg_start);\n if msg_start < message_size {\n msg_byte_ptr = new_msg_byte_ptr;\n verify_msg_block_padding(msg_block, msg_byte_ptr);\n }\n } else if msg_start < message_size {\n msg_byte_ptr = new_msg_byte_ptr;\n }\n }\n\n // If we had modulo == 0 then it means the last block was full,\n // and we can reset the pointer to zero to overwrite it.\n if msg_byte_ptr == BLOCK_SIZE {\n msg_byte_ptr = 0;\n }\n\n // Pad the rest such that we have a [u32; 2] block at the end representing the length\n // of the message, and a block of 1 0 ... 0 following the message (i.e. [1 << 7, 0, ..., 0]).\n // Here we rely on the fact that everything beyond the available input is set to 0.\n msg_block = update_block_item(\n msg_block,\n msg_byte_ptr,\n |msg_item| set_item_byte_then_zeros(msg_item, msg_byte_ptr, 1 << 7),\n );\n msg_byte_ptr = msg_byte_ptr + 1;\n let last_block = msg_block;\n\n // If we don't have room to write the size, compress the block and reset it.\n if msg_byte_ptr > MSG_SIZE_PTR {\n h = sha256_compression(msg_block, h);\n // `attach_len_to_msg_block` will zero out everything after the `msg_byte_ptr`.\n msg_byte_ptr = 0;\n }\n\n msg_block = unsafe { attach_len_to_msg_block(msg_block, msg_byte_ptr, message_size) };\n\n if !is_unconstrained() {\n verify_msg_len(msg_block, last_block, msg_byte_ptr, message_size);\n }\n\n hash_final_block(msg_block, h)\n}\n\n// Take `BLOCK_SIZE` number of bytes from `msg` starting at `msg_start`.\n// Returns the block and the length that has been copied rather than padded with zeros.\nunconstrained fn build_msg_block<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n msg_start: u32,\n) -> (MSG_BLOCK, BLOCK_BYTE_PTR) {\n let mut msg_block: MSG_BLOCK = [0; INT_BLOCK_SIZE];\n\n // We insert `BLOCK_SIZE` bytes (or up to the end of the message)\n let block_input = if msg_start + BLOCK_SIZE > message_size {\n if message_size < msg_start {\n // This function is sometimes called with `msg_start` past the end of the message.\n // In this case we return an empty block and zero pointer to signal that the result should be ignored.\n 0\n } else {\n message_size - msg_start\n }\n } else {\n BLOCK_SIZE\n };\n\n // Figure out the number of items in the int array that we have to pack.\n // e.g. if the input is [0,1,2,3,4,5] then we need to pack it as 2 items: [0123, 4500]\n let mut int_input = block_input / INT_SIZE;\n if block_input % INT_SIZE != 0 {\n int_input = int_input + 1;\n };\n\n for i in 0..int_input {\n let mut msg_item: u32 = 0;\n // Always construct the integer as 4 bytes, even if it means going beyond the input.\n for j in 0..INT_SIZE {\n let k = i * INT_SIZE + j;\n let msg_byte = if k < block_input {\n msg[msg_start + k]\n } else {\n 0\n };\n msg_item = lshift8(msg_item, 1) + msg_byte as u32;\n }\n msg_block[i] = msg_item;\n }\n\n // Returning the index as if it was a 64 byte array.\n // We have to project it down to 16 items and bit shifting to get a byte back if we need it.\n (msg_block, block_input)\n}\n\n// Verify the block we are compressing was appropriately constructed by `build_msg_block`\n// and matches the input data. Returns the index of the first unset item.\n// If `message_size` is less than `msg_start` then this is called with the old non-empty block;\n// in that case we can skip verification, ie. no need to check that everything is zero.\nfn verify_msg_block<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n msg_block: MSG_BLOCK,\n msg_start: u32,\n) -> BLOCK_BYTE_PTR {\n let mut msg_byte_ptr = 0;\n let mut msg_end = msg_start + BLOCK_SIZE;\n if msg_end > N {\n msg_end = N;\n }\n // We might have to go beyond the input to pad the fields.\n if msg_end % INT_SIZE != 0 {\n msg_end = msg_end + INT_SIZE - msg_end % INT_SIZE;\n }\n\n // Reconstructed packed item.\n let mut msg_item: u32 = 0;\n\n // Inclusive at the end so that we can compare the last item.\n let mut i: u32 = 0;\n for k in msg_start..=msg_end {\n if k % INT_SIZE == 0 {\n // If we consumed some input we can compare against the block.\n if (msg_start < message_size) & (k > msg_start) {\n assert_eq(msg_block[i], msg_item as u32);\n i = i + 1;\n msg_item = 0;\n }\n }\n // Shift the accumulator\n msg_item = lshift8(msg_item, 1);\n // If we have input to consume, add it at the rightmost position.\n if k < message_size & k < msg_end {\n msg_item = msg_item + msg[k] as u32;\n msg_byte_ptr = msg_byte_ptr + 1;\n }\n }\n\n msg_byte_ptr\n}\n\n// Verify the block we are compressing was appropriately padded with zeros by `build_msg_block`.\n// This is only relevant for the last, potentially partially filled block.\nfn verify_msg_block_padding(msg_block: MSG_BLOCK, msg_byte_ptr: BLOCK_BYTE_PTR) {\n // Check all the way to the end of the block.\n verify_msg_block_zeros(msg_block, msg_byte_ptr, INT_BLOCK_SIZE);\n}\n\n// Verify that a region of ints in the message block are (partially) zeroed,\n// up to an (exclusive) maximum which can either be the end of the block\n// or just where the size is to be written.\nfn verify_msg_block_zeros(\n msg_block: MSG_BLOCK,\n mut msg_byte_ptr: BLOCK_BYTE_PTR,\n max_int_byte_ptr: u32,\n) {\n // This variable is used to get around the compiler under-constrained check giving a warning.\n // We want to check against a constant zero, but if it does not come from the circuit inputs\n // or return values the compiler check will issue a warning.\n let zero = msg_block[0] - msg_block[0];\n\n // First integer which is supposed to be (partially) zero.\n let mut int_byte_ptr = msg_byte_ptr / INT_SIZE;\n\n // Check partial zeros.\n let modulo = msg_byte_ptr % INT_SIZE;\n if modulo != 0 {\n let zeros = INT_SIZE - modulo;\n let mask = if zeros == 3 {\n TWO_POW_24\n } else if zeros == 2 {\n TWO_POW_16\n } else {\n TWO_POW_8\n };\n assert_eq(msg_block[int_byte_ptr] % mask, zero);\n int_byte_ptr = int_byte_ptr + 1;\n }\n\n // Check the rest of the items.\n for i in 0..max_int_byte_ptr {\n if i >= int_byte_ptr {\n assert_eq(msg_block[i], zero);\n }\n }\n}\n\n// Verify that up to the byte pointer the two blocks are equal.\n// At the byte pointer the new block can be partially zeroed.\nfn verify_msg_block_equals_last(\n msg_block: MSG_BLOCK,\n last_block: MSG_BLOCK,\n mut msg_byte_ptr: BLOCK_BYTE_PTR,\n) {\n // msg_byte_ptr is the position at which they are no longer have to be the same.\n // First integer which is supposed to be (partially) zero contains that pointer.\n let mut int_byte_ptr = msg_byte_ptr / INT_SIZE;\n\n // Check partial zeros.\n let modulo = msg_byte_ptr % INT_SIZE;\n if modulo != 0 {\n // Reconstruct the partially zero item from the last block.\n let last_field = last_block[int_byte_ptr];\n let mut msg_item: u32 = 0;\n // Reset to where they are still equal.\n msg_byte_ptr = msg_byte_ptr - modulo;\n for i in 0..INT_SIZE {\n msg_item = lshift8(msg_item, 1);\n if i < modulo {\n msg_item = msg_item + get_item_byte(last_field, msg_byte_ptr) as u32;\n msg_byte_ptr = msg_byte_ptr + 1;\n }\n }\n assert_eq(msg_block[int_byte_ptr], msg_item);\n }\n\n for i in 0..INT_SIZE_PTR {\n if i < int_byte_ptr {\n assert_eq(msg_block[i], last_block[i]);\n }\n }\n}\n\n// Apply a function on the block item which the pointer indicates.\nfn update_block_item<Env>(\n mut msg_block: MSG_BLOCK,\n msg_byte_ptr: BLOCK_BYTE_PTR,\n f: fn[Env](u32) -> u32,\n) -> MSG_BLOCK {\n let i = msg_byte_ptr / INT_SIZE;\n msg_block[i] = f(msg_block[i]);\n msg_block\n}\n\n// Set the rightmost `zeros` number of bytes to 0.\nfn set_item_zeros(item: u32, zeros: u8) -> u32 {\n lshift8(rshift8(item, zeros), zeros)\n}\n\n// Replace one byte in the item with a value, and set everything after it to zero.\nfn set_item_byte_then_zeros(msg_item: u32, msg_byte_ptr: BLOCK_BYTE_PTR, msg_byte: u8) -> u32 {\n let zeros = INT_SIZE - msg_byte_ptr % INT_SIZE;\n let zeroed_item = set_item_zeros(msg_item, zeros as u8);\n let new_item = byte_into_item(msg_byte, msg_byte_ptr);\n zeroed_item + new_item\n}\n\n// Get a byte of a message item according to its overall position in the `BLOCK_SIZE` space.\nfn get_item_byte(mut msg_item: u32, msg_byte_ptr: BLOCK_BYTE_PTR) -> u8 {\n // How many times do we have to shift to the right to get to the position we want?\n let max_shifts = INT_SIZE - 1;\n let shifts = max_shifts - msg_byte_ptr % INT_SIZE;\n msg_item = rshift8(msg_item, shifts as u8);\n // At this point the byte we want is in the rightmost position.\n msg_item as u8\n}\n\n// Project a byte into a position in a field based on the overall block pointer.\n// For example putting 1 into pointer 5 would be 100, because overall we would\n// have [____, 0100] with indexes [0123,4567].\nfn byte_into_item(msg_byte: u8, msg_byte_ptr: BLOCK_BYTE_PTR) -> u32 {\n let mut msg_item = msg_byte as u32;\n // How many times do we have to shift to the left to get to the position we want?\n let max_shifts = INT_SIZE - 1;\n let shifts = max_shifts - msg_byte_ptr % INT_SIZE;\n lshift8(msg_item, shifts as u8)\n}\n\n// Construct a field out of 4 bytes.\nfn make_item(b0: u8, b1: u8, b2: u8, b3: u8) -> u32 {\n let mut item = b0 as u32;\n item = lshift8(item, 1) + b1 as u32;\n item = lshift8(item, 1) + b2 as u32;\n item = lshift8(item, 1) + b3 as u32;\n item\n}\n\n// Shift by 8 bits to the left between 0 and 4 times.\n// Checks `is_unconstrained()` to just use a bitshift if we're running in an unconstrained context,\n// otherwise multiplies by 256.\nfn lshift8(item: u32, shifts: u8) -> u32 {\n if is_unconstrained() {\n if item == 0 {\n 0\n } else {\n // Brillig wouldn't shift 0<<4 without overflow.\n item << (8 * shifts)\n }\n } else {\n // We can do a for loop up to INT_SIZE or an if-else.\n if shifts == 0 {\n item\n } else if shifts == 1 {\n item * TWO_POW_8\n } else if shifts == 2 {\n item * TWO_POW_16\n } else if shifts == 3 {\n item * TWO_POW_24\n } else {\n // Doesn't make sense, but it's most likely called on 0 anyway.\n 0\n }\n }\n}\n\n// Shift by 8 bits to the right between 0 and 4 times.\n// Checks `is_unconstrained()` to just use a bitshift if we're running in an unconstrained context,\n// otherwise divides by 256.\nfn rshift8(item: u32, shifts: u8) -> u32 {\n if is_unconstrained() {\n item >> (8 * shifts)\n } else {\n // Division wouldn't work on `Field`.\n if shifts == 0 {\n item\n } else if shifts == 1 {\n item / TWO_POW_8\n } else if shifts == 2 {\n item / TWO_POW_16\n } else if shifts == 3 {\n item / TWO_POW_24\n } else {\n 0\n }\n }\n}\n\n// Zero out all bytes between the end of the message and where the length is appended,\n// then write the length into the last 8 bytes of the block.\nunconstrained fn attach_len_to_msg_block(\n mut msg_block: MSG_BLOCK,\n mut msg_byte_ptr: BLOCK_BYTE_PTR,\n message_size: u32,\n) -> MSG_BLOCK {\n // We assume that `msg_byte_ptr` is less than 57 because if not then it is reset to zero before calling this function.\n // In any case, fill blocks up with zeros until the last 64 bits (i.e. until msg_byte_ptr = 56).\n // There can be one item which has to be partially zeroed.\n let modulo = msg_byte_ptr % INT_SIZE;\n if modulo != 0 {\n // Index of the block in which we find the item we need to partially zero.\n let i = msg_byte_ptr / INT_SIZE;\n let zeros = INT_SIZE - modulo;\n msg_block[i] = set_item_zeros(msg_block[i], zeros as u8);\n msg_byte_ptr = msg_byte_ptr + zeros;\n }\n\n // The rest can be zeroed without bit shifting anything.\n for i in (msg_byte_ptr / INT_SIZE)..INT_SIZE_PTR {\n msg_block[i] = 0;\n }\n\n // Set the last two 4 byte ints as the first/second half of the 8 bytes of the length.\n let len = 8 * message_size;\n let len_bytes: [u8; 8] = (len as Field).to_be_bytes();\n for i in 0..=1 {\n let shift = i * 4;\n msg_block[INT_SIZE_PTR + i] = make_item(\n len_bytes[shift],\n len_bytes[shift + 1],\n len_bytes[shift + 2],\n len_bytes[shift + 3],\n );\n }\n msg_block\n}\n\n// Verify that the message length was correctly written by `attach_len_to_msg_block`,\n// and that everything between the byte pointer and the size pointer was zeroed,\n// and that everything before the byte pointer was untouched.\nfn verify_msg_len(\n msg_block: MSG_BLOCK,\n last_block: MSG_BLOCK,\n msg_byte_ptr: BLOCK_BYTE_PTR,\n message_size: u32,\n) {\n // Check zeros up to the size pointer.\n verify_msg_block_zeros(msg_block, msg_byte_ptr, INT_SIZE_PTR);\n\n // Check that up to the pointer we match the last block.\n verify_msg_block_equals_last(msg_block, last_block, msg_byte_ptr);\n\n // We verify the message length was inserted correctly by reversing the byte decomposition.\n let mut reconstructed_len: u64 = 0;\n for i in INT_SIZE_PTR..INT_BLOCK_SIZE {\n reconstructed_len = reconstructed_len * TWO_POW_32;\n reconstructed_len = reconstructed_len + msg_block[i] as u64;\n }\n let len = 8 * message_size as u64;\n assert_eq(reconstructed_len, len);\n}\n\n// Perform the final compression, then transform the `STATE` into `HASH`.\nfn hash_final_block(msg_block: MSG_BLOCK, mut state: STATE) -> HASH {\n let mut out_h: HASH = [0; 32]; // Digest as sequence of bytes\n // Hash final padded block\n state = sha256_compression(msg_block, state);\n\n // Return final hash as byte array\n for j in 0..8 {\n let h_bytes: [u8; 4] = (state[j] as Field).to_be_bytes();\n for k in 0..4 {\n out_h[4 * j + k] = h_bytes[k];\n }\n }\n\n out_h\n}\n\nmod tests {\n use super::{\n attach_len_to_msg_block, build_msg_block, byte_into_item, get_item_byte, make_item,\n set_item_byte_then_zeros, set_item_zeros,\n };\n use super::INT_BLOCK;\n use super::sha256_var;\n\n #[test]\n fn smoke_test() {\n let input = [0xbd];\n let result = [\n 0x68, 0x32, 0x57, 0x20, 0xaa, 0xbd, 0x7c, 0x82, 0xf3, 0x0f, 0x55, 0x4b, 0x31, 0x3d,\n 0x05, 0x70, 0xc9, 0x5a, 0xcc, 0xbb, 0x7d, 0xc4, 0xb5, 0xaa, 0xe1, 0x12, 0x04, 0xc0,\n 0x8f, 0xfe, 0x73, 0x2b,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_just_over_block() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116,\n ];\n let result = [\n 91, 122, 146, 93, 52, 109, 133, 148, 171, 61, 156, 70, 189, 238, 153, 7, 222, 184, 94,\n 24, 65, 114, 192, 244, 207, 199, 87, 232, 192, 224, 171, 207,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_multiple_over_block() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116, 61, 117, 115, 45, 97, 115,\n 99, 105, 105, 13, 10, 109, 105, 109, 101, 45, 118, 101, 114, 115, 105, 111, 110, 58, 49,\n 46, 48, 32, 40, 77, 97, 99, 32, 79, 83, 32, 88, 32, 77, 97, 105, 108, 32, 49, 54, 46,\n 48, 32, 92, 40, 51, 55, 51, 49, 46, 53, 48, 48, 46, 50, 51, 49, 92, 41, 41, 13, 10, 115,\n 117, 98, 106, 101, 99, 116, 58, 72, 101, 108, 108, 111, 13, 10, 109, 101, 115, 115, 97,\n 103, 101, 45, 105, 100, 58, 60, 56, 70, 56, 49, 57, 68, 51, 50, 45, 66, 54, 65, 67, 45,\n 52, 56, 57, 68, 45, 57, 55, 55, 70, 45, 52, 51, 56, 66, 66, 67, 52, 67, 65, 66, 50, 55,\n 64, 109, 101, 46, 99, 111, 109, 62, 13, 10, 100, 97, 116, 101, 58, 83, 97, 116, 44, 32,\n 50, 54, 32, 65, 117, 103, 32, 50, 48, 50, 51, 32, 49, 50, 58, 50, 53, 58, 50, 50, 32,\n 43, 48, 52, 48, 48, 13, 10, 116, 111, 58, 122, 107, 101, 119, 116, 101, 115, 116, 64,\n 103, 109, 97, 105, 108, 46, 99, 111, 109, 13, 10, 100, 107, 105, 109, 45, 115, 105, 103,\n 110, 97, 116, 117, 114, 101, 58, 118, 61, 49, 59, 32, 97, 61, 114, 115, 97, 45, 115,\n 104, 97, 50, 53, 54, 59, 32, 99, 61, 114, 101, 108, 97, 120, 101, 100, 47, 114, 101,\n 108, 97, 120, 101, 100, 59, 32, 100, 61, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109,\n 59, 32, 115, 61, 49, 97, 49, 104, 97, 105, 59, 32, 116, 61, 49, 54, 57, 51, 48, 51, 56,\n 51, 51, 55, 59, 32, 98, 104, 61, 55, 120, 81, 77, 68, 117, 111, 86, 86, 85, 52, 109, 48,\n 87, 48, 87, 82, 86, 83, 114, 86, 88, 77, 101, 71, 83, 73, 65, 83, 115, 110, 117, 99, 75,\n 57, 100, 74, 115, 114, 99, 43, 118, 85, 61, 59, 32, 104, 61, 102, 114, 111, 109, 58, 67,\n 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 77, 105, 109, 101, 45, 86, 101,\n 114, 115, 105, 111, 110, 58, 83, 117, 98, 106, 101, 99,\n ];\n let result = [\n 116, 90, 151, 31, 78, 22, 138, 180, 211, 189, 69, 76, 227, 200, 155, 29, 59, 123, 154,\n 60, 47, 153, 203, 129, 157, 251, 48, 2, 79, 11, 65, 47,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_just_under_block() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59,\n ];\n let result = [\n 143, 140, 76, 173, 222, 123, 102, 68, 70, 149, 207, 43, 39, 61, 34, 79, 216, 252, 213,\n 165, 74, 16, 110, 74, 29, 64, 138, 167, 30, 1, 9, 119,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_big_not_block_multiple() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116, 61, 117, 115, 45, 97, 115,\n 99, 105, 105, 13, 10, 109, 105, 109, 101, 45, 118, 101, 114, 115, 105, 111, 110, 58, 49,\n 46, 48, 32, 40, 77, 97, 99, 32, 79, 83, 32, 88, 32, 77, 97, 105, 108, 32, 49, 54, 46,\n 48, 32, 92, 40, 51, 55, 51, 49, 46, 53, 48, 48, 46, 50, 51, 49, 92, 41, 41, 13, 10, 115,\n 117, 98, 106, 101, 99, 116, 58, 72, 101, 108, 108, 111, 13, 10, 109, 101, 115, 115, 97,\n 103, 101, 45, 105, 100, 58, 60, 56, 70, 56, 49, 57, 68, 51, 50, 45, 66, 54, 65, 67, 45,\n 52, 56, 57, 68, 45, 57, 55, 55, 70, 45, 52, 51, 56, 66, 66, 67, 52, 67, 65, 66, 50, 55,\n 64, 109, 101, 46, 99, 111, 109, 62, 13, 10, 100, 97, 116, 101, 58, 83, 97, 116, 44, 32,\n 50, 54, 32, 65, 117, 103, 32, 50, 48, 50, 51, 32, 49, 50, 58, 50, 53, 58, 50, 50, 32,\n 43, 48, 52, 48, 48, 13, 10, 116, 111, 58, 122, 107, 101, 119, 116, 101, 115, 116, 64,\n 103, 109, 97, 105, 108, 46, 99, 111, 109, 13, 10, 100, 107, 105, 109, 45, 115, 105, 103,\n 110, 97, 116, 117, 114, 101, 58, 118, 61, 49, 59, 32, 97, 61, 114, 115, 97, 45, 115,\n 104, 97, 50, 53, 54, 59, 32, 99, 61, 114, 101, 108, 97, 120, 101, 100, 47, 114, 101,\n 108, 97, 120, 101, 100, 59, 32, 100, 61, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109,\n 59, 32, 115, 61, 49, 97, 49, 104, 97, 105, 59, 32, 116, 61, 49, 54, 57, 51, 48, 51, 56,\n 51, 51, 55, 59, 32, 98, 104, 61, 55, 120, 81, 77, 68, 117, 111, 86, 86, 85, 52, 109, 48,\n 87, 48, 87, 82, 86, 83, 114, 86, 88, 77, 101, 71, 83, 73, 65, 83, 115, 110, 117, 99, 75,\n 57, 100, 74, 115, 114, 99, 43, 118, 85, 61, 59, 32, 104, 61, 102, 114, 111, 109, 58, 67,\n 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 77, 105, 109, 101, 45, 86, 101,\n 114, 115, 105, 111, 110, 58, 83, 117, 98, 106, 101, 99, 116, 58, 77, 101, 115, 115, 97,\n 103, 101, 45, 73, 100, 58, 68, 97, 116, 101, 58, 116, 111, 59, 32, 98, 61,\n ];\n let result = [\n 112, 144, 73, 182, 208, 98, 9, 238, 54, 229, 61, 145, 222, 17, 72, 62, 148, 222, 186,\n 55, 192, 82, 220, 35, 66, 47, 193, 200, 22, 38, 26, 186,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_big_with_padding() {\n let input = [\n 48, 130, 1, 37, 2, 1, 0, 48, 11, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 1, 48, 130, 1, 17,\n 48, 37, 2, 1, 1, 4, 32, 176, 223, 31, 133, 108, 84, 158, 102, 70, 11, 165, 175, 196, 12,\n 201, 130, 25, 131, 46, 125, 156, 194, 28, 23, 55, 133, 157, 164, 135, 136, 220, 78, 48,\n 37, 2, 1, 2, 4, 32, 190, 82, 180, 235, 222, 33, 79, 50, 152, 136, 142, 35, 116, 224, 6,\n 242, 156, 141, 128, 248, 10, 61, 98, 86, 248, 45, 207, 210, 90, 232, 175, 38, 48, 37, 2,\n 1, 3, 4, 32, 0, 194, 104, 108, 237, 246, 97, 230, 116, 198, 69, 110, 26, 87, 17, 89,\n 110, 199, 108, 250, 36, 21, 39, 87, 110, 102, 250, 213, 174, 131, 171, 174, 48, 37, 2,\n 1, 11, 4, 32, 136, 155, 87, 144, 111, 15, 152, 127, 85, 25, 154, 81, 20, 58, 51, 75,\n 193, 116, 234, 0, 60, 30, 29, 30, 183, 141, 72, 247, 255, 203, 100, 124, 48, 37, 2, 1,\n 12, 4, 32, 41, 234, 106, 78, 31, 11, 114, 137, 237, 17, 92, 71, 134, 47, 62, 78, 189,\n 233, 201, 214, 53, 4, 47, 189, 201, 133, 6, 121, 34, 131, 64, 142, 48, 37, 2, 1, 13, 4,\n 32, 91, 222, 210, 193, 62, 222, 104, 82, 36, 41, 138, 253, 70, 15, 148, 208, 156, 45,\n 105, 171, 241, 195, 185, 43, 217, 162, 146, 201, 222, 89, 238, 38, 48, 37, 2, 1, 14, 4,\n 32, 76, 123, 216, 13, 51, 227, 72, 245, 59, 193, 238, 166, 103, 49, 23, 164, 171, 188,\n 194, 197, 156, 187, 249, 28, 198, 95, 69, 15, 182, 56, 54, 38, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n ];\n let result = [\n 32, 85, 108, 174, 127, 112, 178, 182, 8, 43, 134, 123, 192, 211, 131, 66, 184, 240, 212,\n 181, 240, 180, 106, 195, 24, 117, 54, 129, 19, 10, 250, 53,\n ];\n let message_size = 297;\n assert_eq(sha256_var(input, message_size), result);\n }\n\n #[test]\n fn msg_big_no_padding() {\n let input = [\n 48, 130, 1, 37, 2, 1, 0, 48, 11, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 1, 48, 130, 1, 17,\n 48, 37, 2, 1, 1, 4, 32, 176, 223, 31, 133, 108, 84, 158, 102, 70, 11, 165, 175, 196, 12,\n 201, 130, 25, 131, 46, 125, 156, 194, 28, 23, 55, 133, 157, 164, 135, 136, 220, 78, 48,\n 37, 2, 1, 2, 4, 32, 190, 82, 180, 235, 222, 33, 79, 50, 152, 136, 142, 35, 116, 224, 6,\n 242, 156, 141, 128, 248, 10, 61, 98, 86, 248, 45, 207, 210, 90, 232, 175, 38, 48, 37, 2,\n 1, 3, 4, 32, 0, 194, 104, 108, 237, 246, 97, 230, 116, 198, 69, 110, 26, 87, 17, 89,\n 110, 199, 108, 250, 36, 21, 39, 87, 110, 102, 250, 213, 174, 131, 171, 174, 48, 37, 2,\n 1, 11, 4, 32, 136, 155, 87, 144, 111, 15, 152, 127, 85, 25, 154, 81, 20, 58, 51, 75,\n 193, 116, 234, 0, 60, 30, 29, 30, 183, 141, 72, 247, 255, 203, 100, 124, 48, 37, 2, 1,\n 12, 4, 32, 41, 234, 106, 78, 31, 11, 114, 137, 237, 17, 92, 71, 134, 47, 62, 78, 189,\n 233, 201, 214, 53, 4, 47, 189, 201, 133, 6, 121, 34, 131, 64, 142, 48, 37, 2, 1, 13, 4,\n 32, 91, 222, 210, 193, 62, 222, 104, 82, 36, 41, 138, 253, 70, 15, 148, 208, 156, 45,\n 105, 171, 241, 195, 185, 43, 217, 162, 146, 201, 222, 89, 238, 38, 48, 37, 2, 1, 14, 4,\n 32, 76, 123, 216, 13, 51, 227, 72, 245, 59, 193, 238, 166, 103, 49, 23, 164, 171, 188,\n 194, 197, 156, 187, 249, 28, 198, 95, 69, 15, 182, 56, 54, 38,\n ];\n let result = [\n 32, 85, 108, 174, 127, 112, 178, 182, 8, 43, 134, 123, 192, 211, 131, 66, 184, 240, 212,\n 181, 240, 180, 106, 195, 24, 117, 54, 129, 19, 10, 250, 53,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn same_msg_len_variable_padding() {\n let input = [\n 29, 81, 165, 84, 243, 114, 101, 37, 242, 146, 127, 99, 69, 145, 39, 72, 213, 39, 253,\n 179, 218, 37, 217, 201, 172, 93, 198, 50, 249, 70, 15, 30, 162, 112, 187, 40, 140, 9,\n 236, 53, 32, 44, 38, 163, 113, 254, 192, 197, 44, 89, 71, 130, 169, 242, 17, 211, 214,\n 72, 19, 178, 186, 168, 147, 127, 99, 101, 252, 227, 8, 147, 150, 85, 97, 158, 17, 107,\n 218, 244, 82, 113, 247, 91, 208, 214, 60, 244, 87, 137, 173, 201, 130, 18, 66, 56, 198,\n 149, 207, 189, 175, 120, 123, 224, 177, 167, 251, 159, 143, 110, 68, 183, 189, 70, 126,\n 32, 35, 164, 44, 30, 44, 12, 65, 18, 62, 239, 242, 2, 248, 104, 2, 178, 64, 28, 126, 36,\n 137, 24, 14, 116, 91, 98, 90, 159, 218, 102, 45, 11, 110, 223, 245, 184, 52, 99, 59,\n 245, 136, 175, 3, 72, 164, 146, 145, 116, 22, 66, 24, 49, 193, 121, 3, 60, 37, 41, 97,\n 3, 190, 66, 195, 225, 63, 46, 3, 118, 4, 208, 15, 1, 40, 254, 235, 151, 123, 70, 180,\n 170, 44, 172, 90, 4, 254, 53, 239, 116, 246, 67, 56, 129, 61, 22, 169, 213, 65, 27, 216,\n 116, 162, 239, 214, 207, 126, 177, 20, 100, 25, 48, 143, 84, 215, 70, 197, 53, 65, 70,\n 86, 172, 61, 62, 9, 212, 167, 169, 133, 41, 126, 213, 196, 33, 192, 238, 0, 63, 246,\n 215, 58, 128, 110, 101, 92, 3, 170, 214, 130, 149, 52, 81, 125, 118, 233, 3, 118, 193,\n 104, 207, 120, 115, 77, 253, 191, 122, 0, 107, 164, 207, 113, 81, 169, 36, 201, 228, 74,\n 134, 131, 218, 178, 35, 30, 216, 101, 2, 103, 174, 87, 95, 50, 50, 215, 157, 5, 210,\n 188, 54, 211, 78, 45, 199, 96, 121, 241, 241, 176, 226, 194, 134, 130, 89, 217, 210,\n 186, 32, 140, 39, 91, 103, 212, 26, 87, 32, 72, 144, 228, 230, 117, 99, 188, 50, 15, 69,\n 79, 179, 50, 12, 106, 86, 218, 101, 73, 142, 243, 29, 250, 122, 228, 233, 29, 255, 22,\n 121, 114, 125, 103, 41, 250, 241, 179, 126, 158, 198, 116, 209, 65, 94, 98, 228, 175,\n 169, 96, 3, 9, 233, 133, 214, 55, 161, 164, 103, 80, 85, 24, 186, 64, 167, 92, 131, 53,\n 101, 202, 47, 25, 104, 118, 155, 14, 12, 12, 25, 116, 45, 221, 249, 28, 246, 212, 200,\n 157, 167, 169, 56, 197, 181, 4, 245, 146, 1, 140, 234, 191, 212, 228, 125, 87, 81, 86,\n 119, 30, 63, 129, 143, 32, 96,\n ];\n\n // Prepare inputs of different lengths\n let mut input_511 = [0; 511];\n let mut input_512 = [0; 512]; // Next block\n let mut input_575 = [0; 575];\n let mut input_576 = [0; 576]; // Next block\n for i in 0..input.len() {\n input_511[i] = input[i];\n input_512[i] = input[i];\n input_575[i] = input[i];\n input_576[i] = input[i];\n }\n\n // Compute hashes of all inputs (with same message length)\n let fixed_length_hash = super::sha256(input);\n let var_full_length_hash = sha256_var(input, input.len() as u64);\n let var_length_hash_511 = sha256_var(input_511, input.len() as u64);\n let var_length_hash_512 = sha256_var(input_512, input.len() as u64);\n let var_length_hash_575 = sha256_var(input_575, input.len() as u64);\n let var_length_hash_576 = sha256_var(input_576, input.len() as u64);\n\n // All of the above should have produced the same hash\n assert_eq(var_full_length_hash, fixed_length_hash);\n assert_eq(var_length_hash_511, fixed_length_hash);\n assert_eq(var_length_hash_512, fixed_length_hash);\n assert_eq(var_length_hash_575, fixed_length_hash);\n assert_eq(var_length_hash_576, fixed_length_hash);\n }\n\n #[test]\n fn test_get_item_byte() {\n let fld = make_item(10, 20, 30, 40);\n assert_eq(fld, 0x0a141e28);\n assert_eq(get_item_byte(fld, 0), 10);\n assert_eq(get_item_byte(fld, 4), 10);\n assert_eq(get_item_byte(fld, 6), 30);\n }\n\n #[test]\n fn test_byte_into_item() {\n let fld = make_item(0, 20, 0, 0);\n assert_eq(byte_into_item(20, 1), fld);\n assert_eq(byte_into_item(20, 5), fld);\n }\n\n #[test]\n fn test_set_item_zeros() {\n let fld0 = make_item(10, 20, 30, 40);\n let fld1 = make_item(10, 0, 0, 0);\n assert_eq(set_item_zeros(fld0, 3), fld1);\n assert_eq(set_item_zeros(fld0, 4), 0);\n assert_eq(set_item_zeros(0, 4), 0);\n }\n\n #[test]\n fn test_set_item_byte_then_zeros() {\n let fld0 = make_item(10, 20, 30, 40);\n let fld1 = make_item(10, 50, 0, 0);\n assert_eq(set_item_byte_then_zeros(fld0, 1, 50), fld1);\n }\n\n #[test]\n fn test_build_msg_block_start_0() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48,\n ];\n assert_eq(input.len(), 22);\n let (msg_block, msg_byte_ptr) = unsafe { build_msg_block(input, input.len(), 0) };\n assert_eq(msg_byte_ptr, input.len());\n assert_eq(msg_block[0], make_item(input[0], input[1], input[2], input[3]));\n assert_eq(msg_block[1], make_item(input[4], input[5], input[6], input[7]));\n assert_eq(msg_block[5], make_item(input[20], input[21], 0, 0));\n assert_eq(msg_block[6], 0);\n }\n\n #[test]\n fn test_build_msg_block_start_1() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116,\n ];\n assert_eq(input.len(), 68);\n let (msg_block, msg_byte_ptr) = unsafe { build_msg_block(input, input.len(), 64) };\n assert_eq(msg_byte_ptr, 4);\n assert_eq(msg_block[0], make_item(input[64], input[65], input[66], input[67]));\n assert_eq(msg_block[1], 0);\n }\n\n #[test]\n fn test_attach_len_to_msg_block() {\n let input: INT_BLOCK = [\n 2152555847, 1397309779, 1936618851, 1262052426, 1936876331, 1985297723, 543702374,\n 1919905082, 1131376244, 1701737517, 1417244773, 978151789, 1697470053, 1920166255,\n 1849316213, 1651139939,\n ];\n let msg_block = unsafe { attach_len_to_msg_block(input, 1, 448) };\n assert_eq(msg_block[0], ((1 << 7) as u32) * 256 * 256 * 256);\n assert_eq(msg_block[1], 0);\n assert_eq(msg_block[15], 3584);\n }\n}\n"},"393":{"path":"/usr/src/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr","source":"use dep::aztec::macros::aztec;\n\n#[aztec]\ncontract ContractInstanceDeployer {\n use dep::aztec::{\n hash::compute_unencrypted_log_hash,\n macros::{events::event, functions::private},\n oracle::logs::emit_unencrypted_log_private,\n utils::to_bytes::arr_to_be_bytes_arr,\n };\n use dep::aztec::protocol_types::{\n abis::log_hash::LogHash,\n address::{AztecAddress, PartialAddress, PublicKeysHash},\n constants::DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n contract_class_id::ContractClassId,\n public_keys::PublicKeys,\n traits::Serialize,\n };\n use std::meta::derive;\n\n #[event]\n #[derive(Serialize)]\n struct ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE: Field,\n address: AztecAddress,\n version: u8,\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys: PublicKeys,\n deployer: AztecAddress,\n }\n\n // We need to impl this separately because ts deserializes a point as two fields only.\n // We had issues that:\n // Notice how the 'is_infinite' field is deserialized as the next point.\n // {\n // masterNullifierPublicKey: Point {\n // x: Fr<0x0000000000000000000000000000000000000000000000000000000000000012>,\n // y: Fr<0x0000000000000000000000000000000000000000000000000000000000000034>,\n // isInfinite: false,\n // kind: 'point'\n // },\n // masterIncomingViewingPublicKey: Point {\n // x: Fr<0x0000000000000000000000000000000000000000000000000000000000000000>,\n // y: Fr<0x0000000000000000000000000000000000000000000000000000000000000056>,\n // isInfinite: false,\n // kind: 'point'\n // },\n // masterOutgoingViewingPublicKey: Point {\n // x: Fr<0x0000000000000000000000000000000000000000000000000000000000000078>,\n // y: Fr<0x0000000000000000000000000000000000000000000000000000000000000000>,\n // isInfinite: false,\n // kind: 'point'\n // },\n // masterTaggingPublicKey: Point {\n // x: Fr<0x0000000000000000000000000000000000000000000000000000000000000910>,\n // y: Fr<0x0000000000000000000000000000000000000000000000000000000000001112>,\n // isInfinite: false,\n // kind: 'point'\n // }\n impl Serialize<15> for ContractInstanceDeployed {\n fn serialize(self) -> [Field; 15] {\n [\n self.DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n self.address.to_field(),\n self.version.to_field(),\n self.salt,\n self.contract_class_id.to_field(),\n self.initialization_hash,\n self.public_keys.npk_m.serialize()[0],\n self.public_keys.npk_m.serialize()[1],\n self.public_keys.ivpk_m.serialize()[0],\n self.public_keys.ivpk_m.serialize()[1],\n self.public_keys.ovpk_m.serialize()[0],\n self.public_keys.ovpk_m.serialize()[1],\n self.public_keys.tpk_m.serialize()[0],\n self.public_keys.tpk_m.serialize()[1],\n self.deployer.to_field(),\n ]\n }\n }\n\n #[private]\n fn deploy(\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys: PublicKeys,\n universal_deploy: bool,\n ) {\n // TODO(@spalladino): assert nullifier_exists silo(contract_class_id, ContractClassRegisterer)\n let deployer = if universal_deploy {\n AztecAddress::zero()\n } else {\n context.msg_sender()\n };\n\n let partial_address =\n PartialAddress::compute(contract_class_id, salt, initialization_hash, deployer);\n\n let address = AztecAddress::compute(public_keys, partial_address);\n\n // Emit the address as a nullifier to be able to prove that this instance has been (not) deployed\n context.push_nullifier(address.to_field());\n\n // Broadcast the event\n let event = ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n contract_class_id,\n address,\n public_keys,\n initialization_hash,\n salt,\n deployer,\n version: 1,\n };\n\n let payload = event.serialize();\n dep::aztec::oracle::debug_log::debug_log_format(\"ContractInstanceDeployed: {}\", payload);\n\n let contract_address = context.this_address();\n let counter = context.next_counter();\n\n // @todo This is very inefficient, we are doing a lot of back and forth conversions.\n let serialized_log = arr_to_be_bytes_arr(payload);\n let log_hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n // 40 = addr (32) + raw log len (4) + processed log len (4)\n let len = 40 + serialized_log.len().to_field();\n let side_effect = LogHash { value: log_hash, counter, length: len };\n\n // We manually push the unencrypted log to the context and inform the execution environment about this because\n // PrivateContext does not expose an `emit_unencrypted_log` method - this mechanism is considered error-prone\n // and only some canonical contracts use it.\n context.unencrypted_logs_hashes.push(side_effect);\n emit_unencrypted_log_private(contract_address, payload, counter);\n }\n}\n"},"59":{"path":"std/panic.nr","source":"pub fn panic<T, U, let N: u32>(message: fmtstr<N, T>) -> U {\n assert(false, message);\n crate::mem::zeroed()\n}\n"},"98":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/logs.nr","source":"use dep::protocol_types::address::AztecAddress;\n\n/// Informs the simulator that an encrypted note log has been emitted, helping it keep track of side-effects and easing\n/// debugging.\npub fn emit_encrypted_note_log<let M: u32>(\n note_hash_counter: u32,\n encrypted_note: [u8; M],\n counter: u32,\n) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n emit_encrypted_note_log_oracle_wrapper(note_hash_counter, encrypted_note, counter)\n }\n}\n\n/// Informs the simulator that an encrypted event log has been emitted, helping it keep track of side-effects and easing\n/// debugging.\npub fn emit_encrypted_event_log<let M: u32>(\n contract_address: AztecAddress,\n randomness: Field,\n encrypted_event: [u8; M],\n counter: u32,\n) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n emit_encrypted_event_log_oracle_wrapper(\n contract_address,\n randomness,\n encrypted_event,\n counter,\n )\n }\n}\n\n/// Informs the simulator that an unencrypted log has been emitted, helping it keep track of side-effects and easing\n/// debugging.\npub fn emit_unencrypted_log_private<T>(contract_address: AztecAddress, message: T, counter: u32) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n emit_unencrypted_log_private_oracle_wrapper(contract_address, message, counter)\n }\n}\n\nunconstrained fn emit_encrypted_note_log_oracle_wrapper<let M: u32>(\n note_hash_counter: u32,\n encrypted_note: [u8; M],\n counter: u32,\n) {\n emit_encrypted_note_log_oracle(note_hash_counter, encrypted_note, counter)\n}\n\nunconstrained fn emit_encrypted_event_log_oracle_wrapper<let M: u32>(\n contract_address: AztecAddress,\n randomness: Field,\n encrypted_event: [u8; M],\n counter: u32,\n) {\n emit_encrypted_event_log_oracle(contract_address, randomness, encrypted_event, counter)\n}\n\nunconstrained fn emit_unencrypted_log_private_oracle_wrapper<T>(\n contract_address: AztecAddress,\n message: T,\n counter: u32,\n) {\n let _ = emit_unencrypted_log_private_oracle(contract_address, message, counter);\n}\n\n/// Temporary substitute for `emit_unencrypted_log_private` that is used for handling contract class registration. This\n/// variant returns the log hash, which would be too large to compute inside a circuit.\npub unconstrained fn emit_contract_class_unencrypted_log_private<let N: u32>(\n contract_address: AztecAddress,\n message: [Field; N],\n counter: u32,\n) -> Field {\n emit_contract_class_unencrypted_log_private_oracle(contract_address, message, counter)\n}\n\n// = 480 + 32 * N bytes\n#[oracle(emitEncryptedNoteLog)]\nunconstrained fn emit_encrypted_note_log_oracle<let M: u32>(\n _note_hash_counter: u32,\n _encrypted_note: [u8; M],\n _counter: u32,\n) {}\n\n#[oracle(emitEncryptedEventLog)]\nunconstrained fn emit_encrypted_event_log_oracle<let M: u32>(\n _contract_address: AztecAddress,\n _randomness: Field,\n _encrypted_event: [u8; M],\n _counter: u32,\n) {}\n\n#[oracle(emitUnencryptedLog)]\nunconstrained fn emit_unencrypted_log_private_oracle<T>(\n _contract_address: AztecAddress,\n _message: T,\n _counter: u32,\n) -> Field {}\n\n#[oracle(emitContractClassUnencryptedLog)]\nunconstrained fn emit_contract_class_unencrypted_log_private_oracle<let N: u32>(\n contract_address: AztecAddress,\n message: [Field; N],\n counter: u32,\n) -> Field {}\n"}}}
1
+ {
2
+ "transpiled": true,
3
+ "noir_version": "0.38.0+c807678263164209f62fa5c9bf19f468cace1f98-x8664",
4
+ "name": "ContractInstanceDeployer",
5
+ "functions": [
6
+ {
7
+ "name": "deploy",
8
+ "is_unconstrained": false,
9
+ "custom_attributes": [
10
+ "private"
11
+ ],
12
+ "abi": {
13
+ "error_types": {
14
+ "14514982005979867414": {
15
+ "error_kind": "string",
16
+ "string": "attempt to bit-shift with overflow"
17
+ },
18
+ "16761564377371454734": {
19
+ "error_kind": "string",
20
+ "string": "Array index out of bounds"
21
+ },
22
+ "17843811134343075018": {
23
+ "error_kind": "string",
24
+ "string": "Stack too deep"
25
+ },
26
+ "2920182694213909827": {
27
+ "error_kind": "string",
28
+ "string": "attempt to subtract with overflow"
29
+ },
30
+ "5019202896831570965": {
31
+ "error_kind": "string",
32
+ "string": "attempt to add with overflow"
33
+ },
34
+ "6485997221020871071": {
35
+ "error_kind": "string",
36
+ "string": "call to assert_max_bit_size"
37
+ },
38
+ "7233212735005103307": {
39
+ "error_kind": "string",
40
+ "string": "attempt to multiply with overflow"
41
+ }
42
+ },
43
+ "parameters": [
44
+ {
45
+ "name": "inputs",
46
+ "type": {
47
+ "fields": [
48
+ {
49
+ "name": "call_context",
50
+ "type": {
51
+ "fields": [
52
+ {
53
+ "name": "msg_sender",
54
+ "type": {
55
+ "fields": [
56
+ {
57
+ "name": "inner",
58
+ "type": {
59
+ "kind": "field"
60
+ }
61
+ }
62
+ ],
63
+ "kind": "struct",
64
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
65
+ }
66
+ },
67
+ {
68
+ "name": "contract_address",
69
+ "type": {
70
+ "fields": [
71
+ {
72
+ "name": "inner",
73
+ "type": {
74
+ "kind": "field"
75
+ }
76
+ }
77
+ ],
78
+ "kind": "struct",
79
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
80
+ }
81
+ },
82
+ {
83
+ "name": "function_selector",
84
+ "type": {
85
+ "fields": [
86
+ {
87
+ "name": "inner",
88
+ "type": {
89
+ "kind": "integer",
90
+ "sign": "unsigned",
91
+ "width": 32
92
+ }
93
+ }
94
+ ],
95
+ "kind": "struct",
96
+ "path": "aztec::protocol_types::abis::function_selector::FunctionSelector"
97
+ }
98
+ },
99
+ {
100
+ "name": "is_static_call",
101
+ "type": {
102
+ "kind": "boolean"
103
+ }
104
+ }
105
+ ],
106
+ "kind": "struct",
107
+ "path": "aztec::protocol_types::abis::call_context::CallContext"
108
+ }
109
+ },
110
+ {
111
+ "name": "historical_header",
112
+ "type": {
113
+ "fields": [
114
+ {
115
+ "name": "last_archive",
116
+ "type": {
117
+ "fields": [
118
+ {
119
+ "name": "root",
120
+ "type": {
121
+ "kind": "field"
122
+ }
123
+ },
124
+ {
125
+ "name": "next_available_leaf_index",
126
+ "type": {
127
+ "kind": "integer",
128
+ "sign": "unsigned",
129
+ "width": 32
130
+ }
131
+ }
132
+ ],
133
+ "kind": "struct",
134
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
135
+ }
136
+ },
137
+ {
138
+ "name": "content_commitment",
139
+ "type": {
140
+ "fields": [
141
+ {
142
+ "name": "num_txs",
143
+ "type": {
144
+ "kind": "field"
145
+ }
146
+ },
147
+ {
148
+ "name": "txs_effects_hash",
149
+ "type": {
150
+ "kind": "field"
151
+ }
152
+ },
153
+ {
154
+ "name": "in_hash",
155
+ "type": {
156
+ "kind": "field"
157
+ }
158
+ },
159
+ {
160
+ "name": "out_hash",
161
+ "type": {
162
+ "kind": "field"
163
+ }
164
+ }
165
+ ],
166
+ "kind": "struct",
167
+ "path": "aztec::protocol_types::content_commitment::ContentCommitment"
168
+ }
169
+ },
170
+ {
171
+ "name": "state",
172
+ "type": {
173
+ "fields": [
174
+ {
175
+ "name": "l1_to_l2_message_tree",
176
+ "type": {
177
+ "fields": [
178
+ {
179
+ "name": "root",
180
+ "type": {
181
+ "kind": "field"
182
+ }
183
+ },
184
+ {
185
+ "name": "next_available_leaf_index",
186
+ "type": {
187
+ "kind": "integer",
188
+ "sign": "unsigned",
189
+ "width": 32
190
+ }
191
+ }
192
+ ],
193
+ "kind": "struct",
194
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
195
+ }
196
+ },
197
+ {
198
+ "name": "partial",
199
+ "type": {
200
+ "fields": [
201
+ {
202
+ "name": "note_hash_tree",
203
+ "type": {
204
+ "fields": [
205
+ {
206
+ "name": "root",
207
+ "type": {
208
+ "kind": "field"
209
+ }
210
+ },
211
+ {
212
+ "name": "next_available_leaf_index",
213
+ "type": {
214
+ "kind": "integer",
215
+ "sign": "unsigned",
216
+ "width": 32
217
+ }
218
+ }
219
+ ],
220
+ "kind": "struct",
221
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
222
+ }
223
+ },
224
+ {
225
+ "name": "nullifier_tree",
226
+ "type": {
227
+ "fields": [
228
+ {
229
+ "name": "root",
230
+ "type": {
231
+ "kind": "field"
232
+ }
233
+ },
234
+ {
235
+ "name": "next_available_leaf_index",
236
+ "type": {
237
+ "kind": "integer",
238
+ "sign": "unsigned",
239
+ "width": 32
240
+ }
241
+ }
242
+ ],
243
+ "kind": "struct",
244
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
245
+ }
246
+ },
247
+ {
248
+ "name": "public_data_tree",
249
+ "type": {
250
+ "fields": [
251
+ {
252
+ "name": "root",
253
+ "type": {
254
+ "kind": "field"
255
+ }
256
+ },
257
+ {
258
+ "name": "next_available_leaf_index",
259
+ "type": {
260
+ "kind": "integer",
261
+ "sign": "unsigned",
262
+ "width": 32
263
+ }
264
+ }
265
+ ],
266
+ "kind": "struct",
267
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
268
+ }
269
+ }
270
+ ],
271
+ "kind": "struct",
272
+ "path": "aztec::protocol_types::partial_state_reference::PartialStateReference"
273
+ }
274
+ }
275
+ ],
276
+ "kind": "struct",
277
+ "path": "aztec::protocol_types::state_reference::StateReference"
278
+ }
279
+ },
280
+ {
281
+ "name": "global_variables",
282
+ "type": {
283
+ "fields": [
284
+ {
285
+ "name": "chain_id",
286
+ "type": {
287
+ "kind": "field"
288
+ }
289
+ },
290
+ {
291
+ "name": "version",
292
+ "type": {
293
+ "kind": "field"
294
+ }
295
+ },
296
+ {
297
+ "name": "block_number",
298
+ "type": {
299
+ "kind": "field"
300
+ }
301
+ },
302
+ {
303
+ "name": "slot_number",
304
+ "type": {
305
+ "kind": "field"
306
+ }
307
+ },
308
+ {
309
+ "name": "timestamp",
310
+ "type": {
311
+ "kind": "integer",
312
+ "sign": "unsigned",
313
+ "width": 64
314
+ }
315
+ },
316
+ {
317
+ "name": "coinbase",
318
+ "type": {
319
+ "fields": [
320
+ {
321
+ "name": "inner",
322
+ "type": {
323
+ "kind": "field"
324
+ }
325
+ }
326
+ ],
327
+ "kind": "struct",
328
+ "path": "aztec::protocol_types::address::eth_address::EthAddress"
329
+ }
330
+ },
331
+ {
332
+ "name": "fee_recipient",
333
+ "type": {
334
+ "fields": [
335
+ {
336
+ "name": "inner",
337
+ "type": {
338
+ "kind": "field"
339
+ }
340
+ }
341
+ ],
342
+ "kind": "struct",
343
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
344
+ }
345
+ },
346
+ {
347
+ "name": "gas_fees",
348
+ "type": {
349
+ "fields": [
350
+ {
351
+ "name": "fee_per_da_gas",
352
+ "type": {
353
+ "kind": "field"
354
+ }
355
+ },
356
+ {
357
+ "name": "fee_per_l2_gas",
358
+ "type": {
359
+ "kind": "field"
360
+ }
361
+ }
362
+ ],
363
+ "kind": "struct",
364
+ "path": "aztec::protocol_types::abis::gas_fees::GasFees"
365
+ }
366
+ }
367
+ ],
368
+ "kind": "struct",
369
+ "path": "aztec::protocol_types::abis::global_variables::GlobalVariables"
370
+ }
371
+ },
372
+ {
373
+ "name": "total_fees",
374
+ "type": {
375
+ "kind": "field"
376
+ }
377
+ }
378
+ ],
379
+ "kind": "struct",
380
+ "path": "aztec::protocol_types::header::Header"
381
+ }
382
+ },
383
+ {
384
+ "name": "tx_context",
385
+ "type": {
386
+ "fields": [
387
+ {
388
+ "name": "chain_id",
389
+ "type": {
390
+ "kind": "field"
391
+ }
392
+ },
393
+ {
394
+ "name": "version",
395
+ "type": {
396
+ "kind": "field"
397
+ }
398
+ },
399
+ {
400
+ "name": "gas_settings",
401
+ "type": {
402
+ "fields": [
403
+ {
404
+ "name": "gas_limits",
405
+ "type": {
406
+ "fields": [
407
+ {
408
+ "name": "da_gas",
409
+ "type": {
410
+ "kind": "integer",
411
+ "sign": "unsigned",
412
+ "width": 32
413
+ }
414
+ },
415
+ {
416
+ "name": "l2_gas",
417
+ "type": {
418
+ "kind": "integer",
419
+ "sign": "unsigned",
420
+ "width": 32
421
+ }
422
+ }
423
+ ],
424
+ "kind": "struct",
425
+ "path": "aztec::protocol_types::abis::gas::Gas"
426
+ }
427
+ },
428
+ {
429
+ "name": "teardown_gas_limits",
430
+ "type": {
431
+ "fields": [
432
+ {
433
+ "name": "da_gas",
434
+ "type": {
435
+ "kind": "integer",
436
+ "sign": "unsigned",
437
+ "width": 32
438
+ }
439
+ },
440
+ {
441
+ "name": "l2_gas",
442
+ "type": {
443
+ "kind": "integer",
444
+ "sign": "unsigned",
445
+ "width": 32
446
+ }
447
+ }
448
+ ],
449
+ "kind": "struct",
450
+ "path": "aztec::protocol_types::abis::gas::Gas"
451
+ }
452
+ },
453
+ {
454
+ "name": "max_fees_per_gas",
455
+ "type": {
456
+ "fields": [
457
+ {
458
+ "name": "fee_per_da_gas",
459
+ "type": {
460
+ "kind": "field"
461
+ }
462
+ },
463
+ {
464
+ "name": "fee_per_l2_gas",
465
+ "type": {
466
+ "kind": "field"
467
+ }
468
+ }
469
+ ],
470
+ "kind": "struct",
471
+ "path": "aztec::protocol_types::abis::gas_fees::GasFees"
472
+ }
473
+ }
474
+ ],
475
+ "kind": "struct",
476
+ "path": "aztec::protocol_types::abis::gas_settings::GasSettings"
477
+ }
478
+ }
479
+ ],
480
+ "kind": "struct",
481
+ "path": "aztec::protocol_types::transaction::tx_context::TxContext"
482
+ }
483
+ },
484
+ {
485
+ "name": "start_side_effect_counter",
486
+ "type": {
487
+ "kind": "integer",
488
+ "sign": "unsigned",
489
+ "width": 32
490
+ }
491
+ }
492
+ ],
493
+ "kind": "struct",
494
+ "path": "aztec::context::inputs::private_context_inputs::PrivateContextInputs"
495
+ },
496
+ "visibility": "private"
497
+ },
498
+ {
499
+ "name": "salt",
500
+ "type": {
501
+ "kind": "field"
502
+ },
503
+ "visibility": "private"
504
+ },
505
+ {
506
+ "name": "contract_class_id",
507
+ "type": {
508
+ "fields": [
509
+ {
510
+ "name": "inner",
511
+ "type": {
512
+ "kind": "field"
513
+ }
514
+ }
515
+ ],
516
+ "kind": "struct",
517
+ "path": "aztec::protocol_types::contract_class_id::ContractClassId"
518
+ },
519
+ "visibility": "private"
520
+ },
521
+ {
522
+ "name": "initialization_hash",
523
+ "type": {
524
+ "kind": "field"
525
+ },
526
+ "visibility": "private"
527
+ },
528
+ {
529
+ "name": "public_keys",
530
+ "type": {
531
+ "fields": [
532
+ {
533
+ "name": "npk_m",
534
+ "type": {
535
+ "fields": [
536
+ {
537
+ "name": "inner",
538
+ "type": {
539
+ "fields": [
540
+ {
541
+ "name": "x",
542
+ "type": {
543
+ "kind": "field"
544
+ }
545
+ },
546
+ {
547
+ "name": "y",
548
+ "type": {
549
+ "kind": "field"
550
+ }
551
+ },
552
+ {
553
+ "name": "is_infinite",
554
+ "type": {
555
+ "kind": "boolean"
556
+ }
557
+ }
558
+ ],
559
+ "kind": "struct",
560
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
561
+ }
562
+ }
563
+ ],
564
+ "kind": "struct",
565
+ "path": "aztec::protocol_types::public_keys::NpkM"
566
+ }
567
+ },
568
+ {
569
+ "name": "ivpk_m",
570
+ "type": {
571
+ "fields": [
572
+ {
573
+ "name": "inner",
574
+ "type": {
575
+ "fields": [
576
+ {
577
+ "name": "x",
578
+ "type": {
579
+ "kind": "field"
580
+ }
581
+ },
582
+ {
583
+ "name": "y",
584
+ "type": {
585
+ "kind": "field"
586
+ }
587
+ },
588
+ {
589
+ "name": "is_infinite",
590
+ "type": {
591
+ "kind": "boolean"
592
+ }
593
+ }
594
+ ],
595
+ "kind": "struct",
596
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
597
+ }
598
+ }
599
+ ],
600
+ "kind": "struct",
601
+ "path": "aztec::protocol_types::public_keys::IvpkM"
602
+ }
603
+ },
604
+ {
605
+ "name": "ovpk_m",
606
+ "type": {
607
+ "fields": [
608
+ {
609
+ "name": "inner",
610
+ "type": {
611
+ "fields": [
612
+ {
613
+ "name": "x",
614
+ "type": {
615
+ "kind": "field"
616
+ }
617
+ },
618
+ {
619
+ "name": "y",
620
+ "type": {
621
+ "kind": "field"
622
+ }
623
+ },
624
+ {
625
+ "name": "is_infinite",
626
+ "type": {
627
+ "kind": "boolean"
628
+ }
629
+ }
630
+ ],
631
+ "kind": "struct",
632
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
633
+ }
634
+ }
635
+ ],
636
+ "kind": "struct",
637
+ "path": "aztec::protocol_types::public_keys::OvpkM"
638
+ }
639
+ },
640
+ {
641
+ "name": "tpk_m",
642
+ "type": {
643
+ "fields": [
644
+ {
645
+ "name": "inner",
646
+ "type": {
647
+ "fields": [
648
+ {
649
+ "name": "x",
650
+ "type": {
651
+ "kind": "field"
652
+ }
653
+ },
654
+ {
655
+ "name": "y",
656
+ "type": {
657
+ "kind": "field"
658
+ }
659
+ },
660
+ {
661
+ "name": "is_infinite",
662
+ "type": {
663
+ "kind": "boolean"
664
+ }
665
+ }
666
+ ],
667
+ "kind": "struct",
668
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
669
+ }
670
+ }
671
+ ],
672
+ "kind": "struct",
673
+ "path": "aztec::protocol_types::public_keys::TpkM"
674
+ }
675
+ }
676
+ ],
677
+ "kind": "struct",
678
+ "path": "aztec::protocol_types::public_keys::PublicKeys"
679
+ },
680
+ "visibility": "private"
681
+ },
682
+ {
683
+ "name": "universal_deploy",
684
+ "type": {
685
+ "kind": "boolean"
686
+ },
687
+ "visibility": "private"
688
+ }
689
+ ],
690
+ "return_type": {
691
+ "abi_type": {
692
+ "fields": [
693
+ {
694
+ "name": "call_context",
695
+ "type": {
696
+ "fields": [
697
+ {
698
+ "name": "msg_sender",
699
+ "type": {
700
+ "fields": [
701
+ {
702
+ "name": "inner",
703
+ "type": {
704
+ "kind": "field"
705
+ }
706
+ }
707
+ ],
708
+ "kind": "struct",
709
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
710
+ }
711
+ },
712
+ {
713
+ "name": "contract_address",
714
+ "type": {
715
+ "fields": [
716
+ {
717
+ "name": "inner",
718
+ "type": {
719
+ "kind": "field"
720
+ }
721
+ }
722
+ ],
723
+ "kind": "struct",
724
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
725
+ }
726
+ },
727
+ {
728
+ "name": "function_selector",
729
+ "type": {
730
+ "fields": [
731
+ {
732
+ "name": "inner",
733
+ "type": {
734
+ "kind": "integer",
735
+ "sign": "unsigned",
736
+ "width": 32
737
+ }
738
+ }
739
+ ],
740
+ "kind": "struct",
741
+ "path": "aztec::protocol_types::abis::function_selector::FunctionSelector"
742
+ }
743
+ },
744
+ {
745
+ "name": "is_static_call",
746
+ "type": {
747
+ "kind": "boolean"
748
+ }
749
+ }
750
+ ],
751
+ "kind": "struct",
752
+ "path": "aztec::protocol_types::abis::call_context::CallContext"
753
+ }
754
+ },
755
+ {
756
+ "name": "args_hash",
757
+ "type": {
758
+ "kind": "field"
759
+ }
760
+ },
761
+ {
762
+ "name": "returns_hash",
763
+ "type": {
764
+ "kind": "field"
765
+ }
766
+ },
767
+ {
768
+ "name": "min_revertible_side_effect_counter",
769
+ "type": {
770
+ "kind": "integer",
771
+ "sign": "unsigned",
772
+ "width": 32
773
+ }
774
+ },
775
+ {
776
+ "name": "is_fee_payer",
777
+ "type": {
778
+ "kind": "boolean"
779
+ }
780
+ },
781
+ {
782
+ "name": "max_block_number",
783
+ "type": {
784
+ "fields": [
785
+ {
786
+ "name": "_opt",
787
+ "type": {
788
+ "fields": [
789
+ {
790
+ "name": "_is_some",
791
+ "type": {
792
+ "kind": "boolean"
793
+ }
794
+ },
795
+ {
796
+ "name": "_value",
797
+ "type": {
798
+ "kind": "integer",
799
+ "sign": "unsigned",
800
+ "width": 32
801
+ }
802
+ }
803
+ ],
804
+ "kind": "struct",
805
+ "path": "std::option::Option"
806
+ }
807
+ }
808
+ ],
809
+ "kind": "struct",
810
+ "path": "aztec::protocol_types::abis::max_block_number::MaxBlockNumber"
811
+ }
812
+ },
813
+ {
814
+ "name": "note_hash_read_requests",
815
+ "type": {
816
+ "kind": "array",
817
+ "length": 16,
818
+ "type": {
819
+ "fields": [
820
+ {
821
+ "name": "value",
822
+ "type": {
823
+ "kind": "field"
824
+ }
825
+ },
826
+ {
827
+ "name": "counter",
828
+ "type": {
829
+ "kind": "integer",
830
+ "sign": "unsigned",
831
+ "width": 32
832
+ }
833
+ }
834
+ ],
835
+ "kind": "struct",
836
+ "path": "aztec::protocol_types::abis::read_request::ReadRequest"
837
+ }
838
+ }
839
+ },
840
+ {
841
+ "name": "nullifier_read_requests",
842
+ "type": {
843
+ "kind": "array",
844
+ "length": 16,
845
+ "type": {
846
+ "fields": [
847
+ {
848
+ "name": "value",
849
+ "type": {
850
+ "kind": "field"
851
+ }
852
+ },
853
+ {
854
+ "name": "counter",
855
+ "type": {
856
+ "kind": "integer",
857
+ "sign": "unsigned",
858
+ "width": 32
859
+ }
860
+ }
861
+ ],
862
+ "kind": "struct",
863
+ "path": "aztec::protocol_types::abis::read_request::ReadRequest"
864
+ }
865
+ }
866
+ },
867
+ {
868
+ "name": "key_validation_requests_and_generators",
869
+ "type": {
870
+ "kind": "array",
871
+ "length": 16,
872
+ "type": {
873
+ "fields": [
874
+ {
875
+ "name": "request",
876
+ "type": {
877
+ "fields": [
878
+ {
879
+ "name": "pk_m",
880
+ "type": {
881
+ "fields": [
882
+ {
883
+ "name": "x",
884
+ "type": {
885
+ "kind": "field"
886
+ }
887
+ },
888
+ {
889
+ "name": "y",
890
+ "type": {
891
+ "kind": "field"
892
+ }
893
+ },
894
+ {
895
+ "name": "is_infinite",
896
+ "type": {
897
+ "kind": "boolean"
898
+ }
899
+ }
900
+ ],
901
+ "kind": "struct",
902
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
903
+ }
904
+ },
905
+ {
906
+ "name": "sk_app",
907
+ "type": {
908
+ "kind": "field"
909
+ }
910
+ }
911
+ ],
912
+ "kind": "struct",
913
+ "path": "aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"
914
+ }
915
+ },
916
+ {
917
+ "name": "sk_app_generator",
918
+ "type": {
919
+ "kind": "field"
920
+ }
921
+ }
922
+ ],
923
+ "kind": "struct",
924
+ "path": "aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"
925
+ }
926
+ }
927
+ },
928
+ {
929
+ "name": "note_hashes",
930
+ "type": {
931
+ "kind": "array",
932
+ "length": 16,
933
+ "type": {
934
+ "fields": [
935
+ {
936
+ "name": "value",
937
+ "type": {
938
+ "kind": "field"
939
+ }
940
+ },
941
+ {
942
+ "name": "counter",
943
+ "type": {
944
+ "kind": "integer",
945
+ "sign": "unsigned",
946
+ "width": 32
947
+ }
948
+ }
949
+ ],
950
+ "kind": "struct",
951
+ "path": "aztec::protocol_types::abis::note_hash::NoteHash"
952
+ }
953
+ }
954
+ },
955
+ {
956
+ "name": "nullifiers",
957
+ "type": {
958
+ "kind": "array",
959
+ "length": 16,
960
+ "type": {
961
+ "fields": [
962
+ {
963
+ "name": "value",
964
+ "type": {
965
+ "kind": "field"
966
+ }
967
+ },
968
+ {
969
+ "name": "counter",
970
+ "type": {
971
+ "kind": "integer",
972
+ "sign": "unsigned",
973
+ "width": 32
974
+ }
975
+ },
976
+ {
977
+ "name": "note_hash",
978
+ "type": {
979
+ "kind": "field"
980
+ }
981
+ }
982
+ ],
983
+ "kind": "struct",
984
+ "path": "aztec::protocol_types::abis::nullifier::Nullifier"
985
+ }
986
+ }
987
+ },
988
+ {
989
+ "name": "private_call_requests",
990
+ "type": {
991
+ "kind": "array",
992
+ "length": 4,
993
+ "type": {
994
+ "fields": [
995
+ {
996
+ "name": "call_context",
997
+ "type": {
998
+ "fields": [
999
+ {
1000
+ "name": "msg_sender",
1001
+ "type": {
1002
+ "fields": [
1003
+ {
1004
+ "name": "inner",
1005
+ "type": {
1006
+ "kind": "field"
1007
+ }
1008
+ }
1009
+ ],
1010
+ "kind": "struct",
1011
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1012
+ }
1013
+ },
1014
+ {
1015
+ "name": "contract_address",
1016
+ "type": {
1017
+ "fields": [
1018
+ {
1019
+ "name": "inner",
1020
+ "type": {
1021
+ "kind": "field"
1022
+ }
1023
+ }
1024
+ ],
1025
+ "kind": "struct",
1026
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1027
+ }
1028
+ },
1029
+ {
1030
+ "name": "function_selector",
1031
+ "type": {
1032
+ "fields": [
1033
+ {
1034
+ "name": "inner",
1035
+ "type": {
1036
+ "kind": "integer",
1037
+ "sign": "unsigned",
1038
+ "width": 32
1039
+ }
1040
+ }
1041
+ ],
1042
+ "kind": "struct",
1043
+ "path": "aztec::protocol_types::abis::function_selector::FunctionSelector"
1044
+ }
1045
+ },
1046
+ {
1047
+ "name": "is_static_call",
1048
+ "type": {
1049
+ "kind": "boolean"
1050
+ }
1051
+ }
1052
+ ],
1053
+ "kind": "struct",
1054
+ "path": "aztec::protocol_types::abis::call_context::CallContext"
1055
+ }
1056
+ },
1057
+ {
1058
+ "name": "args_hash",
1059
+ "type": {
1060
+ "kind": "field"
1061
+ }
1062
+ },
1063
+ {
1064
+ "name": "returns_hash",
1065
+ "type": {
1066
+ "kind": "field"
1067
+ }
1068
+ },
1069
+ {
1070
+ "name": "start_side_effect_counter",
1071
+ "type": {
1072
+ "kind": "integer",
1073
+ "sign": "unsigned",
1074
+ "width": 32
1075
+ }
1076
+ },
1077
+ {
1078
+ "name": "end_side_effect_counter",
1079
+ "type": {
1080
+ "kind": "integer",
1081
+ "sign": "unsigned",
1082
+ "width": 32
1083
+ }
1084
+ }
1085
+ ],
1086
+ "kind": "struct",
1087
+ "path": "aztec::protocol_types::abis::private_call_request::PrivateCallRequest"
1088
+ }
1089
+ }
1090
+ },
1091
+ {
1092
+ "name": "public_call_requests",
1093
+ "type": {
1094
+ "kind": "array",
1095
+ "length": 16,
1096
+ "type": {
1097
+ "fields": [
1098
+ {
1099
+ "name": "inner",
1100
+ "type": {
1101
+ "fields": [
1102
+ {
1103
+ "name": "msg_sender",
1104
+ "type": {
1105
+ "fields": [
1106
+ {
1107
+ "name": "inner",
1108
+ "type": {
1109
+ "kind": "field"
1110
+ }
1111
+ }
1112
+ ],
1113
+ "kind": "struct",
1114
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1115
+ }
1116
+ },
1117
+ {
1118
+ "name": "contract_address",
1119
+ "type": {
1120
+ "fields": [
1121
+ {
1122
+ "name": "inner",
1123
+ "type": {
1124
+ "kind": "field"
1125
+ }
1126
+ }
1127
+ ],
1128
+ "kind": "struct",
1129
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1130
+ }
1131
+ },
1132
+ {
1133
+ "name": "function_selector",
1134
+ "type": {
1135
+ "fields": [
1136
+ {
1137
+ "name": "inner",
1138
+ "type": {
1139
+ "kind": "integer",
1140
+ "sign": "unsigned",
1141
+ "width": 32
1142
+ }
1143
+ }
1144
+ ],
1145
+ "kind": "struct",
1146
+ "path": "aztec::protocol_types::abis::function_selector::FunctionSelector"
1147
+ }
1148
+ },
1149
+ {
1150
+ "name": "is_static_call",
1151
+ "type": {
1152
+ "kind": "boolean"
1153
+ }
1154
+ },
1155
+ {
1156
+ "name": "args_hash",
1157
+ "type": {
1158
+ "kind": "field"
1159
+ }
1160
+ }
1161
+ ],
1162
+ "kind": "struct",
1163
+ "path": "aztec::protocol_types::abis::public_call_request::PublicCallRequest"
1164
+ }
1165
+ },
1166
+ {
1167
+ "name": "counter",
1168
+ "type": {
1169
+ "kind": "integer",
1170
+ "sign": "unsigned",
1171
+ "width": 32
1172
+ }
1173
+ }
1174
+ ],
1175
+ "kind": "struct",
1176
+ "path": "aztec::protocol_types::abis::side_effect::Counted"
1177
+ }
1178
+ }
1179
+ },
1180
+ {
1181
+ "name": "public_teardown_call_request",
1182
+ "type": {
1183
+ "fields": [
1184
+ {
1185
+ "name": "msg_sender",
1186
+ "type": {
1187
+ "fields": [
1188
+ {
1189
+ "name": "inner",
1190
+ "type": {
1191
+ "kind": "field"
1192
+ }
1193
+ }
1194
+ ],
1195
+ "kind": "struct",
1196
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1197
+ }
1198
+ },
1199
+ {
1200
+ "name": "contract_address",
1201
+ "type": {
1202
+ "fields": [
1203
+ {
1204
+ "name": "inner",
1205
+ "type": {
1206
+ "kind": "field"
1207
+ }
1208
+ }
1209
+ ],
1210
+ "kind": "struct",
1211
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1212
+ }
1213
+ },
1214
+ {
1215
+ "name": "function_selector",
1216
+ "type": {
1217
+ "fields": [
1218
+ {
1219
+ "name": "inner",
1220
+ "type": {
1221
+ "kind": "integer",
1222
+ "sign": "unsigned",
1223
+ "width": 32
1224
+ }
1225
+ }
1226
+ ],
1227
+ "kind": "struct",
1228
+ "path": "aztec::protocol_types::abis::function_selector::FunctionSelector"
1229
+ }
1230
+ },
1231
+ {
1232
+ "name": "is_static_call",
1233
+ "type": {
1234
+ "kind": "boolean"
1235
+ }
1236
+ },
1237
+ {
1238
+ "name": "args_hash",
1239
+ "type": {
1240
+ "kind": "field"
1241
+ }
1242
+ }
1243
+ ],
1244
+ "kind": "struct",
1245
+ "path": "aztec::protocol_types::abis::public_call_request::PublicCallRequest"
1246
+ }
1247
+ },
1248
+ {
1249
+ "name": "l2_to_l1_msgs",
1250
+ "type": {
1251
+ "kind": "array",
1252
+ "length": 2,
1253
+ "type": {
1254
+ "fields": [
1255
+ {
1256
+ "name": "recipient",
1257
+ "type": {
1258
+ "fields": [
1259
+ {
1260
+ "name": "inner",
1261
+ "type": {
1262
+ "kind": "field"
1263
+ }
1264
+ }
1265
+ ],
1266
+ "kind": "struct",
1267
+ "path": "aztec::protocol_types::address::eth_address::EthAddress"
1268
+ }
1269
+ },
1270
+ {
1271
+ "name": "content",
1272
+ "type": {
1273
+ "kind": "field"
1274
+ }
1275
+ },
1276
+ {
1277
+ "name": "counter",
1278
+ "type": {
1279
+ "kind": "integer",
1280
+ "sign": "unsigned",
1281
+ "width": 32
1282
+ }
1283
+ }
1284
+ ],
1285
+ "kind": "struct",
1286
+ "path": "aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"
1287
+ }
1288
+ }
1289
+ },
1290
+ {
1291
+ "name": "start_side_effect_counter",
1292
+ "type": {
1293
+ "kind": "integer",
1294
+ "sign": "unsigned",
1295
+ "width": 32
1296
+ }
1297
+ },
1298
+ {
1299
+ "name": "end_side_effect_counter",
1300
+ "type": {
1301
+ "kind": "integer",
1302
+ "sign": "unsigned",
1303
+ "width": 32
1304
+ }
1305
+ },
1306
+ {
1307
+ "name": "note_encrypted_logs_hashes",
1308
+ "type": {
1309
+ "kind": "array",
1310
+ "length": 16,
1311
+ "type": {
1312
+ "fields": [
1313
+ {
1314
+ "name": "value",
1315
+ "type": {
1316
+ "kind": "field"
1317
+ }
1318
+ },
1319
+ {
1320
+ "name": "counter",
1321
+ "type": {
1322
+ "kind": "integer",
1323
+ "sign": "unsigned",
1324
+ "width": 32
1325
+ }
1326
+ },
1327
+ {
1328
+ "name": "length",
1329
+ "type": {
1330
+ "kind": "field"
1331
+ }
1332
+ },
1333
+ {
1334
+ "name": "note_hash_counter",
1335
+ "type": {
1336
+ "kind": "integer",
1337
+ "sign": "unsigned",
1338
+ "width": 32
1339
+ }
1340
+ }
1341
+ ],
1342
+ "kind": "struct",
1343
+ "path": "aztec::protocol_types::abis::log_hash::NoteLogHash"
1344
+ }
1345
+ }
1346
+ },
1347
+ {
1348
+ "name": "encrypted_logs_hashes",
1349
+ "type": {
1350
+ "kind": "array",
1351
+ "length": 4,
1352
+ "type": {
1353
+ "fields": [
1354
+ {
1355
+ "name": "value",
1356
+ "type": {
1357
+ "kind": "field"
1358
+ }
1359
+ },
1360
+ {
1361
+ "name": "counter",
1362
+ "type": {
1363
+ "kind": "integer",
1364
+ "sign": "unsigned",
1365
+ "width": 32
1366
+ }
1367
+ },
1368
+ {
1369
+ "name": "length",
1370
+ "type": {
1371
+ "kind": "field"
1372
+ }
1373
+ },
1374
+ {
1375
+ "name": "randomness",
1376
+ "type": {
1377
+ "kind": "field"
1378
+ }
1379
+ }
1380
+ ],
1381
+ "kind": "struct",
1382
+ "path": "aztec::protocol_types::abis::log_hash::EncryptedLogHash"
1383
+ }
1384
+ }
1385
+ },
1386
+ {
1387
+ "name": "contract_class_logs_hashes",
1388
+ "type": {
1389
+ "kind": "array",
1390
+ "length": 1,
1391
+ "type": {
1392
+ "fields": [
1393
+ {
1394
+ "name": "value",
1395
+ "type": {
1396
+ "kind": "field"
1397
+ }
1398
+ },
1399
+ {
1400
+ "name": "counter",
1401
+ "type": {
1402
+ "kind": "integer",
1403
+ "sign": "unsigned",
1404
+ "width": 32
1405
+ }
1406
+ },
1407
+ {
1408
+ "name": "length",
1409
+ "type": {
1410
+ "kind": "field"
1411
+ }
1412
+ }
1413
+ ],
1414
+ "kind": "struct",
1415
+ "path": "aztec::protocol_types::abis::log_hash::LogHash"
1416
+ }
1417
+ }
1418
+ },
1419
+ {
1420
+ "name": "historical_header",
1421
+ "type": {
1422
+ "fields": [
1423
+ {
1424
+ "name": "last_archive",
1425
+ "type": {
1426
+ "fields": [
1427
+ {
1428
+ "name": "root",
1429
+ "type": {
1430
+ "kind": "field"
1431
+ }
1432
+ },
1433
+ {
1434
+ "name": "next_available_leaf_index",
1435
+ "type": {
1436
+ "kind": "integer",
1437
+ "sign": "unsigned",
1438
+ "width": 32
1439
+ }
1440
+ }
1441
+ ],
1442
+ "kind": "struct",
1443
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
1444
+ }
1445
+ },
1446
+ {
1447
+ "name": "content_commitment",
1448
+ "type": {
1449
+ "fields": [
1450
+ {
1451
+ "name": "num_txs",
1452
+ "type": {
1453
+ "kind": "field"
1454
+ }
1455
+ },
1456
+ {
1457
+ "name": "txs_effects_hash",
1458
+ "type": {
1459
+ "kind": "field"
1460
+ }
1461
+ },
1462
+ {
1463
+ "name": "in_hash",
1464
+ "type": {
1465
+ "kind": "field"
1466
+ }
1467
+ },
1468
+ {
1469
+ "name": "out_hash",
1470
+ "type": {
1471
+ "kind": "field"
1472
+ }
1473
+ }
1474
+ ],
1475
+ "kind": "struct",
1476
+ "path": "aztec::protocol_types::content_commitment::ContentCommitment"
1477
+ }
1478
+ },
1479
+ {
1480
+ "name": "state",
1481
+ "type": {
1482
+ "fields": [
1483
+ {
1484
+ "name": "l1_to_l2_message_tree",
1485
+ "type": {
1486
+ "fields": [
1487
+ {
1488
+ "name": "root",
1489
+ "type": {
1490
+ "kind": "field"
1491
+ }
1492
+ },
1493
+ {
1494
+ "name": "next_available_leaf_index",
1495
+ "type": {
1496
+ "kind": "integer",
1497
+ "sign": "unsigned",
1498
+ "width": 32
1499
+ }
1500
+ }
1501
+ ],
1502
+ "kind": "struct",
1503
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
1504
+ }
1505
+ },
1506
+ {
1507
+ "name": "partial",
1508
+ "type": {
1509
+ "fields": [
1510
+ {
1511
+ "name": "note_hash_tree",
1512
+ "type": {
1513
+ "fields": [
1514
+ {
1515
+ "name": "root",
1516
+ "type": {
1517
+ "kind": "field"
1518
+ }
1519
+ },
1520
+ {
1521
+ "name": "next_available_leaf_index",
1522
+ "type": {
1523
+ "kind": "integer",
1524
+ "sign": "unsigned",
1525
+ "width": 32
1526
+ }
1527
+ }
1528
+ ],
1529
+ "kind": "struct",
1530
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
1531
+ }
1532
+ },
1533
+ {
1534
+ "name": "nullifier_tree",
1535
+ "type": {
1536
+ "fields": [
1537
+ {
1538
+ "name": "root",
1539
+ "type": {
1540
+ "kind": "field"
1541
+ }
1542
+ },
1543
+ {
1544
+ "name": "next_available_leaf_index",
1545
+ "type": {
1546
+ "kind": "integer",
1547
+ "sign": "unsigned",
1548
+ "width": 32
1549
+ }
1550
+ }
1551
+ ],
1552
+ "kind": "struct",
1553
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
1554
+ }
1555
+ },
1556
+ {
1557
+ "name": "public_data_tree",
1558
+ "type": {
1559
+ "fields": [
1560
+ {
1561
+ "name": "root",
1562
+ "type": {
1563
+ "kind": "field"
1564
+ }
1565
+ },
1566
+ {
1567
+ "name": "next_available_leaf_index",
1568
+ "type": {
1569
+ "kind": "integer",
1570
+ "sign": "unsigned",
1571
+ "width": 32
1572
+ }
1573
+ }
1574
+ ],
1575
+ "kind": "struct",
1576
+ "path": "aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"
1577
+ }
1578
+ }
1579
+ ],
1580
+ "kind": "struct",
1581
+ "path": "aztec::protocol_types::partial_state_reference::PartialStateReference"
1582
+ }
1583
+ }
1584
+ ],
1585
+ "kind": "struct",
1586
+ "path": "aztec::protocol_types::state_reference::StateReference"
1587
+ }
1588
+ },
1589
+ {
1590
+ "name": "global_variables",
1591
+ "type": {
1592
+ "fields": [
1593
+ {
1594
+ "name": "chain_id",
1595
+ "type": {
1596
+ "kind": "field"
1597
+ }
1598
+ },
1599
+ {
1600
+ "name": "version",
1601
+ "type": {
1602
+ "kind": "field"
1603
+ }
1604
+ },
1605
+ {
1606
+ "name": "block_number",
1607
+ "type": {
1608
+ "kind": "field"
1609
+ }
1610
+ },
1611
+ {
1612
+ "name": "slot_number",
1613
+ "type": {
1614
+ "kind": "field"
1615
+ }
1616
+ },
1617
+ {
1618
+ "name": "timestamp",
1619
+ "type": {
1620
+ "kind": "integer",
1621
+ "sign": "unsigned",
1622
+ "width": 64
1623
+ }
1624
+ },
1625
+ {
1626
+ "name": "coinbase",
1627
+ "type": {
1628
+ "fields": [
1629
+ {
1630
+ "name": "inner",
1631
+ "type": {
1632
+ "kind": "field"
1633
+ }
1634
+ }
1635
+ ],
1636
+ "kind": "struct",
1637
+ "path": "aztec::protocol_types::address::eth_address::EthAddress"
1638
+ }
1639
+ },
1640
+ {
1641
+ "name": "fee_recipient",
1642
+ "type": {
1643
+ "fields": [
1644
+ {
1645
+ "name": "inner",
1646
+ "type": {
1647
+ "kind": "field"
1648
+ }
1649
+ }
1650
+ ],
1651
+ "kind": "struct",
1652
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1653
+ }
1654
+ },
1655
+ {
1656
+ "name": "gas_fees",
1657
+ "type": {
1658
+ "fields": [
1659
+ {
1660
+ "name": "fee_per_da_gas",
1661
+ "type": {
1662
+ "kind": "field"
1663
+ }
1664
+ },
1665
+ {
1666
+ "name": "fee_per_l2_gas",
1667
+ "type": {
1668
+ "kind": "field"
1669
+ }
1670
+ }
1671
+ ],
1672
+ "kind": "struct",
1673
+ "path": "aztec::protocol_types::abis::gas_fees::GasFees"
1674
+ }
1675
+ }
1676
+ ],
1677
+ "kind": "struct",
1678
+ "path": "aztec::protocol_types::abis::global_variables::GlobalVariables"
1679
+ }
1680
+ },
1681
+ {
1682
+ "name": "total_fees",
1683
+ "type": {
1684
+ "kind": "field"
1685
+ }
1686
+ }
1687
+ ],
1688
+ "kind": "struct",
1689
+ "path": "aztec::protocol_types::header::Header"
1690
+ }
1691
+ },
1692
+ {
1693
+ "name": "tx_context",
1694
+ "type": {
1695
+ "fields": [
1696
+ {
1697
+ "name": "chain_id",
1698
+ "type": {
1699
+ "kind": "field"
1700
+ }
1701
+ },
1702
+ {
1703
+ "name": "version",
1704
+ "type": {
1705
+ "kind": "field"
1706
+ }
1707
+ },
1708
+ {
1709
+ "name": "gas_settings",
1710
+ "type": {
1711
+ "fields": [
1712
+ {
1713
+ "name": "gas_limits",
1714
+ "type": {
1715
+ "fields": [
1716
+ {
1717
+ "name": "da_gas",
1718
+ "type": {
1719
+ "kind": "integer",
1720
+ "sign": "unsigned",
1721
+ "width": 32
1722
+ }
1723
+ },
1724
+ {
1725
+ "name": "l2_gas",
1726
+ "type": {
1727
+ "kind": "integer",
1728
+ "sign": "unsigned",
1729
+ "width": 32
1730
+ }
1731
+ }
1732
+ ],
1733
+ "kind": "struct",
1734
+ "path": "aztec::protocol_types::abis::gas::Gas"
1735
+ }
1736
+ },
1737
+ {
1738
+ "name": "teardown_gas_limits",
1739
+ "type": {
1740
+ "fields": [
1741
+ {
1742
+ "name": "da_gas",
1743
+ "type": {
1744
+ "kind": "integer",
1745
+ "sign": "unsigned",
1746
+ "width": 32
1747
+ }
1748
+ },
1749
+ {
1750
+ "name": "l2_gas",
1751
+ "type": {
1752
+ "kind": "integer",
1753
+ "sign": "unsigned",
1754
+ "width": 32
1755
+ }
1756
+ }
1757
+ ],
1758
+ "kind": "struct",
1759
+ "path": "aztec::protocol_types::abis::gas::Gas"
1760
+ }
1761
+ },
1762
+ {
1763
+ "name": "max_fees_per_gas",
1764
+ "type": {
1765
+ "fields": [
1766
+ {
1767
+ "name": "fee_per_da_gas",
1768
+ "type": {
1769
+ "kind": "field"
1770
+ }
1771
+ },
1772
+ {
1773
+ "name": "fee_per_l2_gas",
1774
+ "type": {
1775
+ "kind": "field"
1776
+ }
1777
+ }
1778
+ ],
1779
+ "kind": "struct",
1780
+ "path": "aztec::protocol_types::abis::gas_fees::GasFees"
1781
+ }
1782
+ }
1783
+ ],
1784
+ "kind": "struct",
1785
+ "path": "aztec::protocol_types::abis::gas_settings::GasSettings"
1786
+ }
1787
+ }
1788
+ ],
1789
+ "kind": "struct",
1790
+ "path": "aztec::protocol_types::transaction::tx_context::TxContext"
1791
+ }
1792
+ }
1793
+ ],
1794
+ "kind": "struct",
1795
+ "path": "aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"
1796
+ },
1797
+ "visibility": "databus"
1798
+ }
1799
+ },
1800
+ "bytecode": "H4sIAAAAAAAA/+ydDZhWU/v2M9N810wJIZRCKHXv+bpnCkWUPhRCiNJ8RSFEIYqiEEIIoRRFUQhRFEUhRCGKQohCFIWod6/nWetpuq1qZu7zXP9rHce7j2O/sl//9azrvM517us398y0R7X/XnfVq1atzaH//fMe4Z2o/5kQ3g1inpl/lv9zkuW/y7A8q2l5lmV5VtvybJ/wbh3z7CDLf1ff8qyB5dnBlmeHWJ4daan3KMuziOVZjuVZrv5n+cv8e2v9z5xIfm5uaTS7NMgJekWyC4sK8iK5eUX5BUFBkFeQV5JdkJNTWpBbEC0sKoxGCoPcnNKgLK8wpyzy36t+wva1InFd2cXMfTao8j6DIPaJ2lud8K5ebq9Kh636z8re5s+HlftzA/3fmP+7g8N/bxjejcL7kITtz82VGKNBJL4raAxc6+AEXG8OhXkoEmHqdzhwrYZA/Q7zRL8jgGs1AurXGKifLRsOLZcNh5X7c+Nyfz4kJhsOD//9iPA+MrybOMiGI5HnBNibpp54uwnynAD1O8oT/ZoivQzUrxk5G5qWy4Cjyv25Wbk/N4nJhubhv0fCOwjvbAfZcBRwrebA3uR44u1mwLUiQP1yPdGvOXCtAKhfHjkbcsplQG65P+eV+3N2TDbkh/8eDe+C8C50kA0R4Fr5wN608MTbAXCtKFC/lp7olw1cqwCo39HkbGhRLgNalvvz0eX+XBiTDceE/35seLdSe3OQDTnAtY4B9uY4T7ydC1zrWKB+x5O9fVw5Dx9f7s+tyv25dYy324T/fkJ4nxjebS3eTgD35pBqOD3b4fQMyn/9V63bIEYH9NdVT4LtPShi7rN91feZG/vA5tmTEuxf/21c7s/tYzzbIfz3juHdKbxPTthxPWTtao3cavh8Qq7VAZhPncn51LlcrzuW+3Oncn8+OabXXcJ/PyW8Tw3v0yz5hO5516prkFMRDcr7vfxnHF3KPe8ao8Hp4b+fEd5nhnc3BxqcBfNBTi5zn2dXfZ8lkQr06qxyPTm8XK+OKPfns2N6dU74793D+9zwPi/Br68/nwPMkh6ezIrIrz93B+rX0xP9kF9/Pheo3/nkd1mPctnQs9yfzy/35/NisqFX+O9F4V0c3iUJfn39uRewN6WeeBv59ecioH5lnuiH/PpzMVC/3uRsKC2XAWXl/ty73J9LYrLhgvDfLwzvPuHdN8Gvrz9fAOzNRZ54G/n15wuB+l3siX7Irz/3Aep3CTkbLiqXAReX+/Ml5f7cNyYb+oX/fml4Xxbelyf49fXnfsDe9Cf3pn+5Hlxa7s+Xlfvz5TG9uSL89yvDe0B4D3TA5lfhNCizaXBVuVqvKPfn03fx9Ymrw3+/JrwHhfe1WoPYr8ntSpNIfFdwNdAXCeX2eZ3+l8EJ1Xb8BmH1/3F9zLPB+ln5C30wrwYepusqvlbxbtYKBgMbUL3a9m9s39lV0f+t3e27GtGU14HDylxDYs2oHuyxG+MhzbKbvQa7K2YI0MTXJ8DMECmv6fUVOMzx7n0wUAekpjdUQtPd/W+V1/SGcqGZVk7P8ppG4ruCrbteL7u4LMjJK43mRfJ75eaV5Odkl2RHIyW5eWVBuOHswtxQmrLi3IKSguycsuxodvFW7P4i5YPNvEjMW3Ww/vPQ8J/DwvtG/SZNrmYPQ3Rg3UgiB3CPs8trcZP+l+Gxoaj+P/6JeTa8AkEZie/aQcSqHsTSsv9eNwEP9XBScxPA+iFrHlFuraAgJzs7mqP+u4KSSJBbEs402dklRbmR4kiv4uzSwtygsCw3OzenuKS4KFyzV1AWKetVXFhW8N99qYOYUs3NODuCNDncnEDc8M0J+HVvAZqBVfct5eIItK51r4gAuCUBv+6tYLOasFbrxr71mJ/9xavDUKBXR4JxylVwjUzgBNdtCcQN30YIrtuFB5eq+3ZScJmL+UFzvJoOA/bnDk8P6x2kwzoqgbjhUYTDeqfww6rqvtOzwzo0QWaY3gU2fbru913lOH5YuT/fnrD9t0uoacM8b1ruz+Y3Vdwd/rejw/se/X9j1h66k7WHl1t7d//NveE/7wvvMQmcs3m79ih6urwfjK3o/bHqfgB4fqqVuxLA+xwOPJsPgmtGf2lCnU9kX9SZvJ/gnbEJnHcE2jtHAdd6SLh3VPYDvwQXqLMyluCdhx15JxLfFbQD5s4jwL6U/wqGWrdBtf9+DT+h2o5f9z+gmv3C7CM3h7Nufhlp3VLOutFc0rrZJB0C0rokP7D0zS0k6cDymWf60nxG0pfl3/w8zrq5rL6R9huNkPZbTFqX9B6KsnKH1Ld8ks9yenHWzSb5LFpEWvc/37+SVc1+xf5vFOQVhINoYTQ/J7+4LJqX16s0WlRSGskpy86PFpdGgl552eGHz0FxdlCck1+Q3atXWfj/5OcE6NlYcRXy62+KrR5OQGsbIXlh+9c70F/jOpRQO3qPh3mwx8Ye7PFwD/Z4hAd7bOLBHpt6sMdmHuyxuQd7DDzYI/AnoyLorw/mkmoGrrV9rlBfeEuttuM3Gv//YQu9djZv7WC7gdU/G+g/jwv1GR/ej4b3hPCeGN6Phffj4T0pvCeH9xPh/WR4TwnvqeH9VHg/Hd7Twnt6eD8T3s+G93PhPSO8nw/vF8L7xfCeGd4vhffL4T0rvGeH9yvh/Wp4z0motuM3FavNpMY8G2959qjl2QTLs4mWZ49Znj1ueTbJ8myy5dkTlmdPWp5NsTybann2lOXZ05Zn0yzPpluePWN59qzl2XOWZzMsz563PHvB8uxFy7OZlmcvWZ69bHk2y/JstuXZK5Znr1qezdHPqlXDJ7AJMvQbY/l+3E/wI/Fd/wtcdN0r9uOEd0PwPsclxL/Wf39gIRKMB62l+vIoZK3/9nhC/Gtlmx8ZnBjvWrnbf/zwsfjWipT/UcbH41kre8cfi5xU9bUisT9iObmKa+WX/fvHNZ+o2loFth/9fLIqaxXYf4x0SuXXiu7sR1KnVnat6M5/vPWpyq2VvasflX26MmtFd/1jt9MqvtZuf/R4ekXXiu42C4NnKrZWpAK5GjxbkbUiFcro4Lndr5VXwbwPZuxurdwKvzuC53e5Vm5ZJd5DwQu7WitaqXda8OLO1yqo5PsxmLmTtQrLKv2uDV6yrxWpwns7eNm2VqRKM0Aw699rBVWcJ4LZsWuVVHk2CV7Zca2cOOac4NVya2WXxTUzBXMScPMncD4OWDNngv5n64pl9m5nzjkJuLXmwnqR4/THL3D73vHHL15LIG74tQT8uq8DzcCq+/WE7QKD1o24/NF+XGCVUL/aV16Lefpf5idU2/GrIPMStv/cg3k2v9xXRsyF/pkWRGoZUp4HNP18cHMZB3xeAv4rLPMS/HjbvQrs9RuwmvNzXb7t3kjgvO3eTCBu+E3C226B8LedqnuB52+7V2FmKyy2bJfytluo/+Wt2LfdQsvb7i0HbztEapm33UKg6d8iNRed+sia3wbyZrVq+Dfx6zo0EsAeRKLBO+BpAR1aqsfvEKYk6XUb76DrXuTJdIj0+LvknIjEdwWqJ+8ScuIdoIbveXBe3iOcl/fBE7qZVd4vt1eWFmg/vQv002KSrosT/k1u6Gx6BajDBzAdcktdkusH4P6Z68ME4oY/JJDrEuHkqupekrBdYNC6Tsn1FZjZirIt26WQ61L9Lx/FkutSC7l+5IBcEallyHUp0PQfkZqLTn1kzR8Ln0gX69BA/27vxUANkcH7ifB+KL98QphugXVTfo+U8SF6kkV6Z5lwMlIaLiNo+AlQw0/BGpoL/Q5A5tdnwjNH9eQzQuYsJ5HfciJRGy3QZwjppxUkXVc4IOrZQB0+h+kQzXZJ1J+D+2euLxKIG/6CQNQrhRO1qntlwnaBQes6JerZMLMVlFq2SyHqVfpfvowl6lUWov7SAVEjUssQ9Sqg6b8kNRed+siavxI+Ta3QoYEm6hVADZHB+7Xwfii/fE2YboF1U4ja+BA9ySK9s1o4USsNVxM0/Bqo4TdgDc2Ffgcg8+tb4ZmjevItIXO+I5Hfd0SiNlqgzxDST2tIuq5xQNSzgDp8D9Oh1OlfGPc9uH/m+iGBuOEfCES9VjhRq7rXJmwXGLSuU6KeBTNbUGbZLoWo1+l/+TGWqNdZiPpHB0SNSC1D1OuApv+R1Fx06iNr/kn4NLVGhwaaqNcANUQG78/C+6H88jNhugXWTSFq40P0JIv0znrhRK00XE/Q8Geghr+ANTQX+h2AzK9fhWeO6smvhMzZQCK/DUSiNlqgzxDSTxtJum50QNQvA3X4DaZDjlOi/g3cP3P9nkDc8O8Eot4knKhV3ZsStgsMWtcpUb8MM1uxM6LerP/lj1ii3mwh6j8cEDUitQxRbwaa/g9Sc9Gpj6z5T+HT1EYdGmii3gjUEBm8fwnvh/LLX4TpFlg3haiND9GTLNI7W4QTtdJwC0HDv4Aa/g3W0FzodwAyv/4RnjmqJ/8QMmcrify2EonaaIE+Q0g/bSPpus0BUb+EhKhElA69nP6+S9y+dyTqPRKJG1aLo9dNSJRN1KruhHJ/ZQ5oXadE/RIsLPKd/b7LRK15dZNM//tn4r+JWv1HbKJGpJYh6kSg6asncpqLTn1kzUmJwANeDX/g1FtUhQaaqLcB35zI4E0W3g/ll+RE/HQLrJtC1MaH6EkW6Z0UsoaR+K7/nOUUgobJQA1TwRqaC/0OQOZXmvDMUT1JI2ROOpgczAyVnsgjaqMF+gwh/ZRB0jUjkU/UM4E61IDpkF3okqhrgPtnrpqJxA3XJBB1pnCiVnVnek7UM2FEXRK1bJdC1Fla81qxRJ1lIepaDogakVqGqLOApq+VyGkuOvWRNdcWPk1l6NBAE3UGUENk8O4pvB/KL3sSpltg3RSiNj5ET7JI79QRTtRKwzoEDfcEariXJ0SNzK+9hWeO6snehMzZh0R++xCJ2miBPkNIP9Ul6VrXAVG/CCTqfWE6FBW4JOp9wf0z136JxA3vRyDq/YUTtap7f8+J+kUYUecWWLZLIep6WvMDYom6noWoD3BA1IjUMkRdD2j6AxI5zUWnPrLmA4VPU3V1aKCJui5QQ2TwHiS8H8ovBxGmW2DdFKI2PkRPskjv1BdO1ErD+gQNDwJq2MATokbm18HCM0f15GBC5jQkkV9DIlEbLdBnCOmnRiRdGzkg6heARH0ITIc8p9/1fQi4f+Y6NJG44UMJRH2YcKJWdR/mOVG/ACPqImff9d1Ya354LFE3thD14Q6IGpFahqgbA01/eCKnuejUR9Z8hPBpqpEODTRRNwJqiAzeI4X3Q/nlSMJ0C6ybQtTGh+hJFumdJsKJWmnYhKDhkUANm3pC1Mj8Okp45qieHEXInGYk8mtGJGqjBfoMIf3UnKRrcwdE/TyQqCO4T2jyXBJ1BNw/cwWJxA0HBKLOFk7Uqu5sz4n6eRxRF1m2SyHqHK15bixR51iIOtcBUSNSyxB1DtD0uYmc5qJTH1lznvBpqrkODTRRNwdqiAzefOH9UH7JJ0y3wLopRG18iJ5kkd6JCidqpWGUoGE+UMMCT4gamV+FwjNH9aSQkDktSOTXgkjURgv0GUL6qSVJ15YOiHoGkKiPxs2T+S6J+mhw/8x1TCJxw8cQiPpY4USt6j7Wc6KeASPq3F6W7VKIupXWvHUsUbeyEHVrB0SNSC1D1K2Apm+dyGkuOvWRNR8nfJpqqUMDTdQtgRoig/d44f1QfjmeMN0C66YQtfEhepJFeqeNcKJWGrYhaHg8UMMTPCFqZH6dKDxzVE9OJGROWxL5tSUStdECfYaQfmpH0rWdA6J+DkjUJ8F0KHD6t2edBO6fudonEjfcnkDUHYQTtaq7g+dE/RyMqKPO/vasjlrzTrFE3dFC1J0cEDUitQxRdwSavlMip7no1EfWfLLwaaqdDg00UbcDaogM3s7C+6H80pkw3QLrphC18SF6kkV6p4twolYadiFo2Bmo4SmeEDUyv04VnjmqJ6cSMuc0EvmdRiRqowX6DCH91JWka1cHRP0skKhP95SoTwf3z1xnJBI3fAaBqM8UTtSq7jM9J+pnPSTqblrzs2KJupuFqM9yQNSI1DJE3Q1o+rM8IWpkzWcLn6a66tBAE3VXoIbI4D1HeD+UX84hTLfAuilEbXyInmSR3ukunKiVht0JGp4D1PBcT4gamV/nCc8c1ZPzCJnTg0R+PYhEbbRAnyGkn3qSdO3pgKifARL1+TAd8pz+ru/zwf0zV69E4oZ7EYi6SDhRq7qLPCfqZ2BE3cvZ7/ou1pqXxBJ1sYWoSxwQNSK1DFEXA01fkshpLjr1kTWXCp+meurQQBN1T6CGyOAtE94P5ZcywnQLrJtC1MaH6EkW6Z3ewolaadiboGEZUMMLPCFqZH5dKDxzVE8uJGROHxL59SEStdECfYaQfupL0rWvA6KeDiTqi3BEXeKSqC8C989cFycSN3wxgagvEU7Uqu5LPCfq6TiizrFsl0LU/bTml8YSdT8LUV/qgKgRqWWIuh/Q9JcmcpqLTn1kzZcJn6b66tBAE3VfoIbI4L1ceD+UXy4nTLfAuilEbXyInmSR3ukvnKiVhv0JGl4O1PAKT4gamV9XCs8c1ZMrCZkzgER+A4hEbbRAnyGknwaSdB3ogKinAYn6KpgO2U4/o74K3D9zXZ1I3PDVBKK+RjhRq7qv8Zyop8GIusTZZ9SDtObXxhL1IAtRX+uAqBGpZYh6END01yZymotOfWTN1wmfpgbq0EAT9UCghsjgHSy8H8ovgwnTLbBuClEbH6InWaR3hggnaqXhEIKGg4EaXu8JUSPz6wbhmaN6cgMhc4aSyG8okaiNFugzhPTTMJKuwxwQ9dNAor4RpkNOjkuivhHcP3PdlEjc8E0Eoh4unKhV3cM9J+qnYURdXGLZLoWoR2jNb44l6hEWor7ZAVEjUssQ9Qig6W9O5DQXnfrImm8RPk0N06GBJuphQA2RwXur8H4ov9xKmG6BdVOI2vgQPckivTNSOFErDUcSNLwVqOFtnhA1Mr9uF545qie3EzLnDhL53UEkaqMF+gwh/TSKpOsoB0T9FJCo74TpUOr0M+o7wf0z112JxA3fRSDqu4UTtar7bs+J+ikYUQfOPqMerTW/J5aoR1uI+h4HRI1ILUPUo4GmvyeR01x06iNrvlf4NDVKhwaaqEcBNUQG733C+6H8ch9hugXWTSFq40P0JIv0zhjhRK00HEPQ8D6ghvd7QtTI/HpAeOaonjxAyJwHSeT3IJGojRboM4T001iSrmMdEPVUIFE/BNMh1ylRPwTun7keTiRu+GECUT8inKhV3Y94TtRTYURd5Iyox2nNx8cS9TgLUY93QNSI1DJEPQ5o+vGJnOaiUx9Z86PCp6mxOjTQRD0WqCEyeCcI74fyywTCdAusm0LUxofoSRbpnYnCiVppOJGg4QSgho95QtTI/HpceOaonjxOyJxJJPKbRCRqowX6DCH9NJmk62QHRD0FSNRPwHSIFrok6ifA/TPXk4nEDT9JIOopwola1T3Fc6KeAiPqgqhluxSinqo1fyqWqKdaiPopB0SNSC1D1FOBpn8qkdNc+NdRgTU/LXyamqxDA03Uk4EaIoN3mvB+KL9MI0y3wLopRG18iJ5kkd6ZLpyolYbTCRpOA2r4jCdEjcyvZ4VnjurJs4TMeY5Efs8RidpogT5DSD/NIOk6wwFRPwkk6udxn9A4Jernwf0z1wuJxA2/QCDqF4UTtar7Rc+J+kkYUec6I+qZWvOXYol6poWoX3JA1IjUMkQ9E2j6lxI5zUWnPrLml4VPUzN0aKCJegZQQ2TwzhLeD+WXWYTpFlg3haiND9GTLNI7s4UTtdJwNkHDWUANX/GEqJH59arwzFE9eZWQOXNI5DeHSNRGC/QZQvppLknXuQ6I+gkgUb+G+4w64pKoXwP3z1yvJxI3/DqBqOcJJ2pV9zzPifoJGFEXRizbpRD1fK35G7FEPd9C1G84IGpEahming80/RuJnOaiUx9Z85vCp6m5OjTQRD0XqCEyeBcI74fyywLCdAusm0LUxofoSRbpnYXCiVppuJCg4QKghm95QtTI/HpbeOaonrxNyJx3SOT3DpGojRboM4T00yKSroscEPVkIFG/i5snA5dE/S64f+Z6L5G44fcIRP2+cKJWdb/vOVFPhhF1fplluxSiXqw1/yCWqBdbiPoDB0SNSC1D1IuBpv8gkdNcdOoja/5Q+DS1SIcGmqgXATVEBu8S4f1QfllCmG6BdVOI2vgQPckivbNUOFErDZcSNFwC1PAjT4gamV8fC88c1ZOPCZnzCYn8PiEStdECfYaQflpG0nWZA6KeBCTqT2E65Dr927M+BffPXJ8lEjf8GYGolwsnalX3cs+JehKMqIuc/e1ZK7Tmn8cS9QoLUX/ugKgRqWWIegXQ9J8ncpqLTn1kzV8In6aW6dBAE/UyoIbI4F0pvB/KLysJ0y2wbgpRGx+iJ1mkd1YJJ2ql4SqChiuBGn7pCVEj8+sr4ZmjevIVIXO+JpHf10SiNlqgzxDST6tJuq52QNSPA4n6G5gOpU4/o/4G3D9zfZtI3PC3BKL+TjhRq7q/85yoH4cRdeDsM+o1WvPvY4l6jYWov3dA1IjUMkS9Bmj67xM5zUWnPrLmH4RPU6t1aKCJejVQQ2TwrhXeD+WXtYTpFlg3haiND9GTLNI764QTtdJwHUHDtUANf/SEqJH59ZPwzFE9+YmQOT+TyO9nIlEbLdBnCOmn9SRd1zsg6seARP0LTIeyPJdE/Qu4f+b6NZG44V8JRL1BOFGrujd4TtSPwYg6UmTZLoWoN2rNf4sl6o0Wov7NAVEjUssQ9Uag6X9L5DQXnfrImn8XPk2t16GBJur1QA2RwbtJeD+UXzYRpltg3RSiNj5ET7JI72wWTtRKw80EDTcBNfzDE6JG5tefwjNH9eRPQub8RSK/v4hEbbRAnyGkn7aQdN3igKgnAon6b5gOhU6/6/tvcP/M9U8iccP/EIh6q3CiVnVv9ZyoJ8KIOt/Zd31vM5pXr7YjPW+zELX6j9hEjUgtQ9TbkKavzmkuOvWRNe9RXfY0tUWHBpqotwA1RAZvgvB+KL+oPaKnW2DdFKI2PkRPskjvJJI1jMR3/ecsqz2iNSzvnXg1rA7W0FzodwAyv5KEZ47qSRIhc5KBvS4/QyVX5xG10QJ9hpB+SiHpmlKdT9QTgESdCtOhzOnv+k4F989cadWJG06rjl83HfhiYdWdXn27wKB1nRL1BBhRB85+13eG1rxGLFFnVP83UddwQNSI1DJEnQE0fY3qnOaiUx9Zc03h01SKDg00UacANUQGb6bwfii/ZBKmW2DdFKI2PkRPskjvZAknaqVhFkHDTKCGtTwhamR+1RaeOaontQmZsyeJ/PYkErXRAn2GkH6qQ9K1jtbVJV0+moCtxVx7VSdueC8CXe4tnC5V3XsT6NK2V8QB2ZtwiIEHj95vqRoi697Hk2GiDrDmusKHCVXrPoRhYl/hw7fqy77kzIlXw/1Ig8N+/weDw3jS4LB/deKG9ycMDvWEDw6q7nqeDA7KyPUIhxh48Oj9lqohsu4DPBkc9gPWfKDwwUHVegBhcDhI+OCg+nIQOXPi1bA+aXCo7+Az/HHAz/AbAM+Qy2GpAbh/5jq4OnHDBxOGpYbChyVVd0NHw1Ikviuor/eK/uiwPrBHyH43Ev4CVUHXiPACPUT4C1TVfAih7kNJL71DLd8CgtaE3TPEGW9IGHqQ5/0w4b5XGh5G0LARUMPGnoAW8p1zuPD3hOrJ4YS8PIKUl0cQP+7dmRaR+K4A6Sc1DqZW2z5nlb/Q+z60Gue8VoPuM5v6vZ3lvdZA/7lJ2ISm4X1UeDcL7+bhrRqjKC47vNXPOOeGt/rtYfnhHQ3vgvAuDO8W4d0yvI8O72PC+9jwbqX8Ed7Hhffx4d0mvE8I7xPDu214twvvk8K7fXh3qF5tx+8hbaIHiPLPmlqeHWV51szyrLnlWcTyLLA8y7Y8y7E8y7U8y7M8y7c8i1qeFVieFVqetbA8a2l5drTl2TGWZ8danrWyPGtteXac5dnxlmdtLM9OsDw70fKsreVZO8uzkyzP2luedbAMqwfrf7bW/4zEd+0QOvGGZRNA8JrvfW4KWkvVeBRkrf/q1Sz+tbK1XkHzeNfK/Z/2QSS+tSLl+hgE8ayVvYMnguyqrxWJ8VeQU8W18sv+5dUgt2prFVh8H+RVZa0C6xkK8iu/VnQn5zGIVnat6E7PdlBQubWyd5ETQWFl1oruMnOCFhVfq3g3+RW0rOha0d1mYXB0xdaKVCBXg2MqslakQhkdHLv7tfIqmPdBq92tlVvhd0fQepdr5ZZV4j0UHLertaKVeqcFx+98rYJKvh+DNjtZq7Cs0u/a4AT7WpEqvLeDE21rRao0AwRt/71WUMV5ImgXu1ZJlWeT4KQd18qJY84J2pdbK7ssrpkp6ODJF2k6VMet1RFWc47Tn8btCOxV+f12qk7ccCfCV1hOBpqBVffJ1bcLDFrX6U/j4oKhxNlP43bWmneJ/apJZ23C8s+6VOf/NC4itQyRdgaavgu4uYwD3rk6/svUnT1527UH9voUWM35uS7fdqeQ3nanVidu+FTC2+404W87Vfdpnr/t2sPMVlhs2S7lbddVa3567Nuuq+Vtd7qDt1174NuuK9D0p5Oai059ZM1n4NLT+kF0vPs7WYcG+hsYkGhwJnhaQIeW6vGZhClJet3GO+i6u3kyHSI9fhY5JyLxXYHqyVmEnDgTqOHZHpyXswnn5RzwhG5mlXPK7ZWlBdpPZwH91J2ka/fq/J+4OAmow7kwHXJLXZLrueD+meu86sQNn0cg1x7CyVXV3cNzcj0JZraibMt2KeTaU2t+fiy59rSQ6/kOyBWRWoZcewJNfz6puejUR9bcS/hE2l2HBvpHn7oDNUQGb5Hwfii/FBGmW2DdlB+jMT5ET7JI7xQLJyOlYTFBwyKghiWefFUCmV+lwjNH9aSUkDllJPIrIxK10QJ9hpB+6k3StbcDom4H1OECmA7RbJdEfQG4f+a6sDpxwxcSiLqPcKJWdffxnKjbwcxWUGrZLoWo+2rNL4ol6r4Wor7IAVEjUssQdV+g6S8iNRed+siaLxY+TfXWoYEm6t5ADZHBe4nwfii/XEKYboF1U4ja+BA9ySK90084USsN+xE0vASo4aWeEDUyvy4TnjmqJ5cRMudyEvldTiRqowX6DCH91J+ka38HRN0WqMMVMB1Knf5WwCvA/TPXldWJG76SQNQDhBO1qnuA50TdFma2oMyyXQpRD9SaXxVL1AMtRH2VA6JGpJYh6oFA019Fai469ZE1Xy18muqvQwNN1P2BGiKD9xrh/VB+uYYw3QLrphC18SF6kkV6Z5BwolYaDiJoeA1Qw2s9IWpkfl0nPHNUT64jZM5gEvkNJhK10QJ9hpB+GkLSdYgDoj4RqMP1MB1ynBL19eD+meuG6sQN30Ag6qHCiVrVPdRzoj4RZrZiZ0Q9TGt+YyxRD7MQ9Y0OiBqRWoaohwFNfyOpuejUR9Z8k/BpaogODTRRDwFqiAze4cL7ofwynDDdAuumELXxIXqSRXpnhHCiVhqOIGg4HKjhzZ4QNTK/bhGeOaontxAy51YS+d1KJGqjBfoMIf00kqTrSAdEfQJQh9tgOvRy+vsubwP3z1y3Vydu+HYCUd8hnKhV3Xd4TtQnwMyW7+z3XY7Smt8ZS9SjLER9pwOiRqSWIepRQNPfSWouOvWRNd8lfJoaqUMDTdQjgRoig/du4f1QfrmbMN0C66YQtfEhepJFeme0cKJWGo4maHg3UMN7PCFqZH7dKzxzVE/uJWTOfSTyu49I1EYL9BlC+mkMSdcxDoi6DVCH+2E6ZBe6JOr7wf0z1wPViRt+gEDUDwonalX3g54TdRuY2Uqilu1SiHqs1vyhWKIeayHqhxwQNSK1DFGPBZr+IVJz0amPrPlh4dPUGB0aaKIeA9QQGbyPCO+H8ssjhOkWWDeFqI0P0ZMs0jvjhBO10nAcQcNHgBqO94Sokfn1qPDMUT15lJA5E0jkN4FI1EYL9BlC+mkiSdeJDoj6eKAOj8F0KCpwSdSPgftnrserEzf8OIGoJwknalX3JM+J+niY2XILLNulEPVkrfkTsUQ92ULUTzggakRqGaKeDDT9E6TmolMfWfOTwqepiTo00EQ9EaghMninCO+H8ssUwnQLrJtC1MaH6EkW6Z2pwolaaTiVoOEUoIZPeULUyPx6WnjmqJ48TcicaSTym0YkaqMF+gwh/TSdpOt0B0R9HFCHZ2A65Dn9ru9nwP0z17PViRt+lkDUzwknalX3c54T9XG4Lzs5+67vGVrz52OJeoaFqJ93QNSI1DJEPQNo+udJzUWnPrLmF4RPU9N1aKCJejpQQ2Twvii8H8ovLxKmW2DdFKI2PkRPskjvzBRO1ErDmQQNXwRq+JInRI3Mr5eFZ47qycuEzJlFIr9ZRKI2WqDPENJPs0m6znZA1K2BOryC+4QmzyVRvwLun7lerU7c8KsEop4jnKhV3XM8J+rWOOgqsmyXQtRzteavxRL1XAtRv+aAqBGpZYh6LtD0r5Gai059ZM2vC5+mZuvQQBP1bKCGyOCdJ7wfyi/zCNMtsG4KURsfoidZpHfmCydqpeF8gobzgBq+4QlRI/PrTeGZo3ryJiFzFpDIbwGRqI0W6DOE9NNCkq4LHRB1K6AOb+HmyXyXRP0WuH/mers6ccNvE4j6HeFErep+x3OiboX7slMvy3YpRL1Ia/5uLFEvshD1uw6IGpFahqgXAU3/Lqm56NRH1vye8GlqoQ4NNFEvBGqIDN73hfdD+eV9wnQLrJtC1MaH6EkW6Z3FwolaabiYoOH7QA0/8ISokfn1ofDMUT35kJA5S0jkt4RI1EYL9BlC+mkpSdelDoj6WKAOH8F0KHD6t2d9BO6fuT6uTtzwxwSi/kQ4Uau6P/GcqI+FmS3q7G/PWqY1/zSWqJdZiPpTB0SNSC1D1MuApv+U1Fx06iNr/kz4NLVUhwaaqJcCNUQG73Lh/VB+WU6YboF1U4ja+BA9ySK9s0I4USsNVxA0XA7U8HNPiBqZX18IzxzVky8ImbOSRH4riURttECfIaSfVpF0XeWAqI8B6vClp0T9Jbh/5vqqOnHDXxGI+mvhRK3q/tpzoj7GQ6JerTX/JpaoV1uI+hsHRI1ILUPUq4Gm/8YTokbW/K3waWqVDg00Ua8CaogM3u+E90P55TvCdAusm0LUxofoSRbpnTXCiVppuIag4XdADb/3hKiR+fWD8MxRPfmBkDlrSeS3lkjURgv0GUL6aR1J13UOiPpooA4/wnTIc/q7vn8E989cP1UnbvgnAlH/LJyoVd0/e07UR8PM1svZ7/perzX/JZao11uI+hcHRI1ILUPU64Gm/4XUXHTqI2v+Vfg0tU6HBpqo1wE1RAbvBuH9UH7ZQJhugXVTiNr4ED3JIr2zUThRKw03EjTcANTwN0+IGplfvwvPHNWT3wmZs4lEfpuIRG20QJ8hpJ82k3Td7ICoWwJ1+ANH1CUuifoPcP/M9Wd14ob/JBD1X8KJWtX9l+dE3RIHXTmW7VKIeovW/O9Yot5iIeq/HRA1IrUMUW8Bmv5vUnPRqY+s+R/h09RmHRpoot4M1BAZvFuF90P5ZSthugXWTSFq40P0JIv0zjbhRK003EbQcCty8Enyg6iR+bVHkuzMUT1Re0Sf6QRgr8vPUAlJPKI2WqDPENJPiSRdE5P4RN0CqEN1mA7ZTj+jrg7un7mSkogbTkrCr5ucJJuoVd3JSdsFBq3rlKhbwIaWEmefUadozVOTqu1IzylJ/yZq9R+xiboFkKhTgKZPTeI0F536yJrThE9TiTo00ESdCNQQGbzpwvuh/JJOmG7TwSSD3p/xIXqSRXong6xhJL7rP2c5g6BhOlDDGp4QNTK/agrPHNWTmoTMySSRXyaRqI0W6DOE9FMWSdcsB0RdCCTqWjAdcnJcEnUtcP/MVTuJuOHaBKLeUzhRq7r39JyoC2FEXVxi2S6FqOtozfeKJeo6FqLeywFRFwKJug7Q9HslcZqLTn1kzXsLn6aydGigiToLqCEyePcR3g/ll30I0y2wbgpRGx+iJ1mkd+oKJ2qlYV2ChvsANdzXE6JG5td+wjNH9WQ/QubsTyK//YlEbbRAnyGkn+qRdK3ngKgLgER9AEyHUqefUR8A7p+5DkwibvhAAlEfJJyoVd0HeU7UBTCiDpx9Rl1fa94glqjrW4i6gQOiLgASdX2g6RskcZqLTn1kzQcLn6bq6dBAE3U9oIbI4G0ovB/KLw0J0y2wbgpRGx+iJ1mkdxoJJ2qlYSOChg2BGh7iCVEj8+tQ4ZmjenIoIXMOI5HfYUSiNlqgzxDST41JujZ2QNRRIFEfDtMh1ylRHw7un7mOSCJu+AgCUR8pnKhV3Ud6TtRRGFEXOSPqJlrzprFE3cRC1E0dEHUUSNRNgKZvmsRpLjr1kTUfJXyaaqxDA03UjYEaIoO3mfB+KL80I0y3wLopRG18iJ5kkd5pLpyolYbNCRo2A2oY8YSokfkVCM8c1ZOAkDnZJPLLJhK10QJ9hpB+yiHpmuOAqPOBRJ0L0yFa6JKoc8H9M1deEnHDeQSizhdO1KrufM+JOh9G1AVRy3YpRB3VmhfEEnXUQtQFDog6H0jUUaDpC5I4zYV/HRVYc6HwaSpHhwaaqHOAGiKDt4Xwfii/tCBMt8C6KURtfIieZJHeaSmcqJWGLQkatgBqeLQnRI3Mr2OEZ47qyTGEzDmWRH7HEonaaIE+Q0g/tSLp2soBUecBibo17hMap0TdGtw/cx2XRNzwcQSiPl44Uau6j/ecqPNgRJ3rjKjbaM1PiCXqNhaiPsEBUecBiboN0PQnJHGai059ZM0nCp+mWunQQBN1K6CGyOBtK7wfyi9tCdMtsG4KURsfoidZpHfaCSdqpWE7goZtgRqe5AlRI/OrvfDMUT1pT8icDiTy60AkaqMF+gwh/dSRpGtHB0SdCyTqTrjPqCMuiboTuH/mOjmJuOGTCUTdWThRq7o7e07UuTCiLoxYtksh6i5a81NiibqLhahPcUDUuUCi7gI0/SlJnOaiUx9Z86nCp6mOOjTQRN0RqCEyeE8T3g/ll9MI0y2wbgpRGx+iJ1mkd7oKJ2qlYVeChqcBNTzdE6JG5tcZwjNH9eQMQuacSSK/M4lEbbRAnyGkn7qRdO3mgKhzgER9Fm6eDFwS9Vng/pnr7CTihs8mEPU5wola1X2O50SdAyPq/DLLdilE3V1rfm4sUXe3EPW5Dog6B0jU3YGmPzeJ01x06iNrPk/4NNVNhwaaqLsBNUQGbw/h/VB+6UGYboF1U4ja+BA9ySK901M4USsNexI07AHU8HxPiBqZX72EZ47qSS9C5hSRyK+ISNRGC/QZQvqpmKRrsQOizgYSdQnuex6d/u1ZJeD+mas0ibjhUgJRlwknalV3medEnY37zWTO/vas3lrzC2KJureFqC9wQNTZQKLuDTT9BUmc5qJTH1nzhcKnqWIdGmiiLgZqiAzePsL7ofzShzDdAuumELXxIXqSRXqnr3CiVhr2JWjYB6jhRZ4QNTK/LhaeOaonFxMy5xIS+V1CJGqjBfoMIf3Uj6RrPwdEHQCJ+lKYDqVOP6O+FNw/c12WRNzwZQSivlw4Uau6L/ecqAPc357l7DPq/lrzK2KJur+FqK9wQNQBkKj7A01/RRKnuejUR9Z8pfBpqp8ODTRR9wNqiAzeAcL7ofwygDDdAuumELXxIXqSRXpnoHCiVhoOJGg4AKjhVZ4QNTK/rhaeOaonVxMy5xoS+V1DJGqjBfoMIf00iKTrIAdEHQES9bUwHcryXBL1teD+meu6JOKGryMQ9WDhRK3qHuw5UUdgRB0psmyXQtRDtObXxxL1EAtRX++AqCNAoh4CNP31SZzmolMfWfMNwqepQTo00EQ9CKghMniHCu+H8stQwnQLrJtC1MaH6EkW6Z1hwolaaTiMoOFQoIY3ekLUyPy6SXjmqJ7cRMic4STyG04kaqMF+gwh/TSCpOsIB0TdHEjUN8N0KHT6Xd83g/tnrluSiBu+hUDUtwonalX3rZ4TdXPcz1E7+67vkVrz22KJeqSFqG9zQNTNgUQ9Emj625I4zUWnPrLm24VPUyN0aKCJegRQQ2Tw3iG8H8ovdxCmW2DdFKI2PkRPskjvjBJO1ErDUQQN7wBqeKcnRI3Mr7uEZ47qyV2EzLmbRH53E4naaIE+Q0g/jSbpOtoBUTcDEvU9uM+onf6u73vA/TPXvUnEDd9LIOr7hBO1qvs+z4m6Ge67vp39ru8xWvP7Y4l6jIWo73dA1M2ARD0GaPr7kzjNRac+suYHhE9To3VooIl6NFBDZPA+KLwfyi8PEqZbYN0UojY+RE+ySO+MFU7USsOxBA0fBGr4kCdEjcyvh4VnjurJw4TMeYREfo8QidpogT5DSD+NI+k6Tuvqki6Pqo6txVzjk4gbHk+gy0eF06Wq+1ECXdr2ijggjxIOMfDg0fstVUNk3RM8GSbGAWueKHyYULVOIAwTjwkfvlVfHiNnTrwaPk4aHB7/PxgcmpIGh0lJxA1PIgwOk4UPDqruyZ4MDsrIkwmHGHjw6P2WqiGy7ic8GRweB9b8pPDBQdX6BGFwmCJ8cFB9mULOnHg1nEoaHKY6+Ay/CfAz/KeAZ8jlsPRUEmdYejqJuOGnCcPSNOHDkqp7mqNhKRLfFUzVe0V/dDgV2CNkv6cLf4GqoJtOeIE+I/wFqmp+hlD3s6SX3rOWbwFBa8LuGeKMTyMMPcjz/pxw3ysNnyNoOB2o4QxPQAv5znle+HtC9eR5Ql6+QMrLF4gf9+5Mi0h8V4D0kwKF1Grb56zyF3rfh1XjnNdq0H1mU7+3s7zXGug/zwz7+VJ4vxzes8J7dni/Et6vhvec8J4b3q+F9+vhPS+854f3G+H9ZngvCO+F4f1WeL8d3u+E96Lwfje83wvv98N7cXh/EN4fhveS8F4a3h+F98fh/UlStR2/h3SmHiDKP3vJ8uxly7NZlmezLc9esTx71fJsjuXZXMuz1yzPXrc8m2d5Nt/y7A3LszctzxZYni20PHvL8uxty7N3LM8WWZ69a3n2nuXZ+5Zniy3PPrA8+9DybInl2VLLs48szz62PPvEMqwerP/ZWv8zEt+1Q+jEG5YzAcFrvvf5JdBaqsaXIWv9V69Z8a+VrfUKZse7Vu7/tA9eiW+tSLk+Bq/Gs1b2Dp4I5lR9rUiMv4K5VVwrv+xfXg1eq9paBRbfB69XZa0C6xkK5lV+rehOzmMwv7JrRXd6toM3KrdW9i5yInizMmtFd5k5wYKKr1W8m/wKFlZ0rehuszB4q2JrRSqQq8HbFVkrUqGMDt7Z/Vp5Fcz7YNHu1sqt8LsjeHeXa+WWVeI9FLy3q7WilXqnBe/vfK2CSr4fg8U7WauwrNLv2uAD+1qRKry3gw9ta0WqNAMES/69VlDFeSJYGrtWSZVnk+CjHdfKiWPOCT4ut1Z2WVwzU/CJJ1+k+SQJt9YyWM05Tn8adxmwV+X3+2kSccOfEr7C8hnQDKy6P0vaLjBoXac/jYsLhhJnP427XGu+IvarJsu1Ccs/W5HE/2lcRGoZIl0ONP0KcHMZB3x5Ev7L1Ms9edt9DOz157Ca83Ndvu0+J73tvkgibvgLwttupfC3nap7pedvu49hZisstmyX8rZbpTX/MvZtt8rytvvSwdvuY+DbbhXQ9F+SmotOfWTNX+HS0/pBdLz7+0yHBvobGJBo8DV4WkCHlurx14QpSXrdxjvould7Mh0iPf4NOSci8V2B6sk3hJz4Gqjhtx6cl28J5+U78IRuZpXvyu2VpQXaT98A/bSGpOuaJP5PXHwE1OF7mA65pS7J9Xtw/8z1QxJxwz8QyHWtcHJVda/1nFw/gpmtKNuyXQq5rtOa/xhLruss5PqjA3JFpJYh13VA0/9Iai469ZE1/yR8Il2jQwP9o09rgBoig/dn4f1QfvmZMN0C66b8GI3xIXqSRXpnvXAyUhquJ2j4M1DDXzz5qgQyv34VnjmqJ78SMmcDifw2EInaaIE+Q0g/bSTputEBUS8F6vAbTIdotkui/g3cP3P9nkTc8O8Eot4knKhV3Zs8J+qlMLMVlFq2SyHqzVrzP2KJerOFqP9wQNSI1DJEvRlo+j9IzUWnPrLmP4VPUxt1aKCJeiNQQ2Tw/iW8H8ovfxGmW2DdFKI2PkRPskjvbBFO1ErDLQQN/wJq+LcnRI3Mr3+EZ47qyT+EzNlKIr+tRKI2WqDPENJP20i6bnNA1EuQEJWM0qHU6W8FxO17R6LeI5m4YbU4et2EZNlErepOSN4uMGhdp0S9BBYWQZlluxSiTtSaV0+utiM9Jyb/m6jVf8QmakRqGaJOBJq+ejKnuejUR9aclAw84NXwB069RVVooIl6G/DNiQzeZOH9UH5JTsZPt8C6KURtfIieZJHeSSFrGInv+s9ZTiFomAzUMBWsobnQ7wBkfqUJzxzVkzRC5qSDycHMUOnJPKI2WqDPENJPGSRdM5L5RP0hUIcaMB1ynBJ1DXD/zFUzmbjhmgSizhRO1KruTM+J+kMYURc7I+osrXmtWKLOshB1LQdE/SGQqLOApq+VzGkuOvWRNdcWPk1l6NBAE3UGUENk8O4pvB/KL3sSpltg3RSiNj5ET7JI79QRTtRKwzoEDfcEariXJ0SNzK+9hWeO6snehMzZh0R++xCJ2miBPkNIP9Ul6VrXAVF/ACTqfWE69HL6+y73BffPXPslEze8H4Go9xdO1Kru/T0n6g9gRJ3v7Pdd1tOaHxBL1PUsRH2AA6L+AEjU9YCmPyCZ01x06iNrPlD4NFVXhwaaqOsCNUQG70HC+6H8chBhugXWTSFq40P0JIv0Tn3hRK00rE/Q8CCghg08IWpkfh0sPHNUTw4mZE5DEvk1JBK10QJ9hpB+akTStZEDol4MJOpDYDpkF7ok6kPA/TPXocnEDR9KIOrDhBO1qvswz4l6MYyoS6KW7VKIurHW/PBYom5sIerDHRD1YiBRNwaa/vBkTnPRqY+s+Qjh01QjHRpoom4E1BAZvEcK74fyy5GE6RZYN4WojQ/RkyzSO02EE7XSsAlBwyOBGjb1hKiR+XWU8MxRPTmKkDnNSOTXjEjURgv0GUL6qTlJ1+YOiPp9IFFHYDoUFbgk6gi4f+YKkokbDghEnS2cqFXd2Z4T9fu4X4hfYNkuhahztOa5sUSdYyHqXAdE/T6QqHOAps9N5jQXnfrImvOET1PNdWigibo5UENk8OYL74fySz5hugXWTSFq40P0JIv0TlQ4USsNowQN84EaFnhC1Mj8KhSeOaonhYTMaUEivxZEojZaoM8Q0k8tSbq2dEDU7wGJ+miYDnlOv+v7aHD/zHVMMnHDxxCI+ljhRK3qPtZzon4P9xcsOfuu71Za89axRN3KQtStHRD1e0CibgU0fetkTnPRqY+s+Tjh01RLHRpoom4J1BAZvMcL74fyy/GE6RZYN4WojQ/RkyzSO22EE7XSsA1Bw+OBGp7gCVEj8+tE4ZmjenIiIXPaksivLZGojRboM4T0UzuSru0cEPW7QKI+CfcJTZ5Loj4J3D9ztU8mbrg9gag7CCdqVXcHz4n6XRxRF1m2SyHqjlrzTrFE3dFC1J0cEPW7QKLuCDR9p2ROc9Gpj6z5ZOHTVDsdGmiibgfUEBm8nYX3Q/mlM2G6BdZNIWrjQ/Qki/ROF+FErTTsQtCwM1DDUzwhamR+nSo8c1RPTiVkzmkk8juNSNRGC/QZQvqpK0nXrg6IehGQqE/HzZP5Lon6dHD/zHVGMnHDZxCI+kzhRK3qPtNzol6E+67vXpbtUoi6m9b8rFii7mYh6rMcEPUiIFF3A5r+rGROc9Gpj6z5bOHTVFcdGmii7grUEBm85wjvh/LLOYTpFlg3haiND9GTLNI73YUTtdKwO0HDc4AanusJUSPz6zzhmaN6ch4hc3qQyK8HkaiNFugzhPRTT5KuPR0Q9TtAoj4fpkOB078963xw/8zVK5m44V4Eoi4STtSq7iLPifodGFFHyyzbpRB1sda8JJaoiy1EXeKAqN8BEnUx0PQlyZzmolMfWXOp8Gmqpw4NNFH3BGqIDN4y4f1QfikjTLfAuilEbXyInmSR3uktnKiVhr0JGpYBNbzAE6JG5teFwjNH9eRCQub0IZFfHyJRGy3QZwjpp74kXfs6IOq3gUR9kadEfRG4f+a6OJm44YsJRH2JcKJWdV/iOVG/7SFR99OaXxpL1P0sRH2pA6J+G0jU/YCmv9QTokbWfJnwaaqvDg00UfcFaogM3suF90P55XLCdAusm0LUxofoSRbpnf7CiVpp2J+g4eVADa/whKiR+XWl8MxRPbmSkDkDSOQ3gEjURgv0GUL6aSBJ14EOiPotIFFfBdMhz+nv+r4K3D9zXZ1M3PDVBKK+RjhRq7qv8Zyo34IRdS9nv+t7kNb82liiHmQh6msdEPVbQKIeBDT9tcmc5qJTH1nzdcKnqYE6NNBEPRCoITJ4Bwvvh/LLYMJ0C6ybQtTGh+hJFumdIcKJWmk4hKDhYKCG13tC1Mj8ukF45qie3EDInKEk8htKJGqjBfoMIf00jKTrMAdEvRBI1DfiiLrEJVHfCO6fuW5KJm74JgJRDxdO1Kru4Z4T9UIcUedYtksh6hFa85tjiXqEhahvdkDUC4FEPQJo+puTOc1Fpz6y5luET1PDdGigiXoYUENk8N4qvB/KL7cSpltg3RSiNj5ET7JI74wUTtRKw5EEDW8FanibJ0SNzK/bhWeO6snthMy5g0R+dxCJ2miBPkNIP40i6TrKAVEvABL1nTAdsp1+Rn0nuH/muiuZuOG7CER9t3CiVnXf7TlRL4ARdYmzz6hHa83viSXq0RaivscBUS8AEvVooOnvSeY0F536yJrvFT5NjdKhgSbqUUANkcF7n/B+KL/cR5hugXVTiNr4ED3JIr0zRjhRKw3HEDS8D6jh/Z4QNTK/HhCeOaonDxAy50ES+T1IJGqjBfoMIf00lqTrWAdE/SaQqB+C6ZCT45KoHwL3z1wPJxM3/DCBqB8RTtSq7kc8J+o3YURdXGLZLoWox2nNx8cS9TgLUY93QNRvAol6HND045M5zUWnPrLmR4VPU2N1aKCJeixQQ2TwThDeD+WXCYTpFlg3haiND9GTLNI7E4UTtdJwIkHDCUANH/OEqJH59bjwzFE9eZyQOZNI5DeJSNRGC/QZQvppMknXyQ6I+g0gUT8B06HU6WfUT4D7Z64nk4kbfpJA1FOEE7Wqe4rnRP0GjKgDZ59RT9WaPxVL1FMtRP2UA6J+A0jUU4GmfyqZ01x06iNrflr4NDVZhwaaqCcDNUQG7zTh/VB+mUaYboF1U4ja+BA9ySK9M104USsNpxM0nAbU8BlPiBqZX88KzxzVk2cJmfMcifyeIxK10QJ9hpB+mkHSdYYDop4PJOrnYTrkOiXq58H9M9cLycQNv0Ag6heFE7Wq+0XPiXo+jKiLnBH1TK35S7FEPdNC1C85IOr5QKKeCTT9S8mc5qJTH1nzy8KnqRk6NNBEPQOoITJ4Zwnvh/LLLMJ0C6ybQtTGh+hJFumd2cKJWmk4m6DhLKCGr3hC1Mj8elV45qievErInDkk8ptDJGqjBfoMIf00l6TrXAdEPQ9I1K/BdIgWuiTq18D9M9frycQNv04g6nnCiVrVPc9zop4HI+qCqGW7FKKerzV/I5ao51uI+g0HRD0PSNTzgaZ/I5nTXPjXUYE1vyl8mpqrQwNN1HOBGiKDd4Hwfii/LCBMt8C6KURtfIieZJHeWSicqJWGCwkaLgBq+JYnRI3Mr7eFZ47qyduEzHmHRH7vEInaaIE+Q0g/LSLpusgBUb8OJOp3cZ/QOCXqd8H9M9d7ycQNv0cg6veFE7Wq+33Pifp1GFHnOiPqxVrzD2KJerGFqD9wQNSvA4l6MdD0HyRzmotOfWTNHwqfphbp0EAT9SKghsjgXSK8H8ovSwjTLbBuClEbH6InWaR3lgonaqXhUoKGS4AafuQJUSPz62PhmaN68jEhcz4hkd8nRKI2WqDPENJPy0i6LnNA1K8BifpT3GfUEZdE/Sm4f+b6LJm44c8IRL1cOFGrupd7TtSvwYi6MGLZLoWoV2jNP48l6hUWov7cAVG/BiTqFUDTf57MaS469ZE1fyF8mlqmQwNN1MuAGiKDd6Xwfii/rCRMt8C6KURtfIieZJHeWSWcqJWGqwgargRq+KUnRI3Mr6+EZ47qyVeEzPmaRH5fE4naaIE+Q0g/rSbputoBUc8FEvU3uHkycEnU34D7Z65vk4kb/pZA1N8JJ2pV93eeE/VcGFHnl1m2SyHqNVrz72OJeo2FqL93QNRzgUS9Bmj675M5zUWnPrLmH4RPU6t1aKCJejVQQ2TwrhXeD+WXtYTpFlg3haiND9GTLNI764QTtdJwHUHDtUANf/SEqJH59ZPwzFE9+YmQOT+TyO9nIlEbLdBnCOmn9SRd1zsg6jlAov4F9z2PTv/2rF/A/TPXr8nEDf9KIOoNwola1b3Bc6Keg/vNZM7+9qyNWvPfYol6o4Wof3NA1HOARL0RaPrfkjnNRac+subfhU9T63VooIl6PVBDZPBuEt4P5ZdNhOkWWDeFqI0P0ZMs0jubhRO10nAzQcNNQA3/8ISokfn1p/DMUT35k5A5f5HI7y8iURst0GcI6actJF23OCDqV4FE/TdMh1Knn1H/De6fuf5JJm74HwJRbxVO1KrurZ4T9au4vz2rzLJdClFvM5qbE2kSapuFqNV/xCbqV4FEvQ1p+hROc9Gpj6x5jxTZ09QWHRpoot4C1BAZvAnC+6H8ovaInm6BdVOI2vgQPckivZNI1jAS3/Wfs6z2iNawvHfi1bA6WENzod8ByPxKEp45qidJhMxJBva6/AyVnMIjaqMF+gwh/ZRC0jUlhU/UrwCJOhWmQ1meS6JOBffPXGkpxA2npeDXTQe+WFh1p6dsFxi0rlOifgVG1JEiy3YpRJ2hNa8RS9QZKf8m6hoOiPoVIFFnAE1fI4XTXHTqI2uuKXyaStGhgSbqFKCGyODNFN4P5ZdMwnQLrJtC1MaH6EkW6Z0s4UStNMwiaJgJ1LCWJ0SNzK/awjNH9aQ2IXP2JJHfnkSiNlqgzxDST3VIutZxQNSzgUS9F0yHQqff9b0XuH/m2juFuOG9CUS9j3CiVnXv4zlRz8b9HLWz7/quqzXfN5ao61qIel8HRD0bSNR1gabfN4XTXHTqI2veT/g0VUeHBpqo6wA1RAbv/sL7ofyyP2G6BdZNIWrjQ/Qki/ROPeFErTSsR9Bwf6CGB3hC1Mj8OlB45qieHEjInINI5HcQkaiNFugzhPRTfZKu9R0Q9SwgUTfAfUbt9Hd9NwD3z1wHpxA3fDCBqBsKJ2pVd0PPiXoW7ru+nf2u70Za80NiibqRhagPcUDUs4BE3Qho+kNSOM1Fpz6y5kOFT1P1dWigibo+UENk8B4mvB/KL4cRpltg3RSiNj5ET7JI7zQWTtRKw8YEDQ8Dani4J0SNzK8jhGeO6skRhMw5kkR+RxKJ2miBPkNIPzUh6dpE6+qSLl9OwtZirqYpxA03JdDlUcLpUtV9FIEubXtFHJCjCIcYePDo/ZaqIbLuZp4ME02ANTcXPkyoWpsRhomI8OFb9SVCzpx4NQxIg0PwfzA4vEQaHLJTiBvOJgwOOcIHB1V3jieDgzJyDuEQAw8evd9SNUTWnevJ4BAAa84TPjioWnMJg0O+8MFB9SWfnDnxahglDQ5RB5/hzwR+hl8APEMuh6WCFM6wVJhC3HAhYVhqIXxYUnW3cDQsReK7gqjeK/qjwyiwR8h+txT+AlVB15LwAj1a+AtU1Xw0oe5jSC+9YyzfAoLWhN0zxBlvQRh6kOf9WOG+VxoeS9CwJVDDVp6AFvKd01r4e+I/PSHk5XGkvDyO+HHvzrSIxHcFSD8pUEittn3OKn+h9924Gue8VoPuM5v6vZ3lvdZA/7lN2M8TwvvE8G4b3u3C+6Twbh/eHcK7Y3h3Cu+Tw7tzeHcJ71PC+9TwPi28u4b36eF9RnifGd7dwvus8D47vM8J7+7hfW54nxfePcK7Z3ifH969wrvIUKI5EG30AFH+2QmWZydanrW1PGtneXaS5Vl7y7MOlmcdLc86WZ6dbHnW2fKsi+XZKZZnp1qenWZ51tXy7HTLszMsz860POtmeXaW5dnZlmfnWJ51tzw71/LsPMuzHpZnPS3Pzrc862V5VmQZVg/W/2yt/xmJ79ohdOINyzaA4DXf+3wCaC1V44mQtf6rV9v418rWegXt4l0r93/aByfFt1akXB+D9vGslb2DJ4IOVV8rEuOvoGMV18ov+5dXg05VW6vA4vvg5KqsVWA9Q0Hnyq8V3cl5DLpUdq3oTs92cErl1sreRU4Ep1ZmreguMyc4reJrFe8mv4KuFV0rutssDE6v2FqRCuRqcEZF1opUKKODM3e/Vl4F8z7otru1civ87gjO2uVauWWVeA8FZ+9qrWil3mnBOTtfq6CS78eg+07WKiyr9Ls2ONe+VqQK7+3gPNtakSrNAEGPf68VVHGeCHrGrlVS5dkkOH/HtXLimHOCXuXWyi6La2YKijz5Ik1RCm6tYljNOU5/GrcY2Kvy+y1JIW64hPAVllKgGVh1l6ZsFxi0rtOfxsUFQ4mzn8Yt05r3jv2qSZk2YflnvVP4P42LSC1DpGVA0/cGN5dxwMtS8F+mLvPkbdcL2OsLYDXn57p8211AettdmELc8IWEt10f4W87VXcfz992vWBmKyy2bJfytuurNb8o9m3X1/K2u8jB264X8G3XF2j6i0jNRac+suaLcelp/SA63v2V6tBAfwMDEg0uAU8L6NBSPb6EMCVJr9t4B113P0+mQ6THLyXnRCS+K1A9uZSQE5cANbzMg/NyGeG8XA6e0M2scnm5vbK0QPvpUqCf+pN07Z/C/4mL84E6XAHTIbfUJbleAe6fua5MIW74SgK5DhBOrqruAZ6T6/kwsxVlW7ZLIdeBWvOrYsl1oIVcr3JArojUMuQ6EGj6q0jNRac+suarhU+k/XVooH/0qT9QQ2TwXiO8H8ov1xCmW2DdlB+jMT5ET7JI7wwSTkZKw0EEDa8BanitJ1+VQObXdcIzR/XkOkLmDCaR32AiURst0GcI6achJF2HOCDqnkAdrofpEM12SdTXg/tnrhtSiBu+gUDUQ4UTtap7qOdE3RNmtoJSy3YpRD1Ma35jLFEPsxD1jQ6IGpFahqiHAU1/I6m56NRH1nyT8GlqiA4NNFEPAWqIDN7hwvuh/DKcMN0C66YQtfEhepJFemeEcKJWGo4gaDgcqOHNnhA1Mr9uEZ45qie3EDLnVhL53UokaqMF+gwh/TSSpOtIB0TdA6jDbTAdSp3+VsDbwP0z1+0pxA3fTiDqO4QTtar7Ds+JugfMbEGZZbsUoh6lNb8zlqhHWYj6TgdEjUgtQ9SjgKa/k9RcdOoja75L+DQ1UocGmqhHAjVEBu/dwvuh/HI3YboF1k0hauND9CSL9M5o4UStNBxN0PBuoIb3eELUyPy6V3jmqJ7cS8ic+0jkdx+RqI0W6DOE9NMYkq5jHBD1eUAd7ofpkOOUqO8H989cD6QQN/wAgagfFE7Uqu4HPSfq82BmK3ZG1GO15g/FEvVYC1E/5ICoEalliHos0PQPkZqLTn1kzQ8Ln6bG6NBAE/UYoIbI4H1EeD+UXx4hTLfAuilEbXyInmSR3hknnKiVhuMIGj4C1HC8J0SNzK9HhWeO6smjhMyZQCK/CUSiNlqgzxDSTxNJuk50QNTnAnV4DKZDL6e/7/IxcP/M9XgKccOPE4h6knCiVnVP8pyoz4WZLd/Z77ucrDV/IpaoJ1uI+gkHRI1ILUPUk4Gmf4LUXHTqI2t+Uvg0NVGHBpqoJwI1RAbvFOH9UH6ZQphugXVTiNr4ED3JIr0zVThRKw2nEjScAtTwKU+IGplfTwvPHNWTpwmZM41EftOIRG20QJ8hpJ+mk3Sd7oCouwN1eAamQ3ahS6J+Btw/cz2bQtzwswSifk44Uau6n/OcqLvDzFYStWyXQtQztObPxxL1DAtRP++AqBGpZYh6BtD0z5Oai059ZM0vCJ+mpuvQQBP1dKCGyOB9UXg/lF9eJEy3wLopRG18iJ5kkd6ZKZyolYYzCRq+CNTwJU+IGplfLwvPHNWTlwmZM4tEfrOIRG20QJ8hpJ9mk3Sd7YCozwHq8ApMh6ICl0T9Crh/5no1hbjhVwlEPUc4Uau653hO1OfAzJZbYNkuhajnas1fiyXquRaifs0BUSNSyxD1XKDpXyM1F536yJpfFz5NzdahgSbq2UANkcE7T3g/lF/mEaZbYN0UojY+RE+ySO/MF07USsP5BA3nATV8wxOiRubXm8IzR/XkTULmLCCR3wIiURst0GcI6aeFJF0XOiDqs4E6vAXTIc/pd32/Be6fud5OIW74bQJRvyOcqFXd73hO1Gfjvuzk7Lu+F2nN340l6kUWon7XAVEjUssQ9SKg6d8lNRed+sia3xM+TS3UoYEm6oVADZHB+77wfii/vE+YboF1U4ja+BA9ySK9s1g4USsNFxM0fB+o4QeeEDUyvz4UnjmqJx8SMmcJifyWEInaaIE+Q0g/LSXputQBUZ8F1OEj3Cc0eS6J+iNw/8z1cQpxwx8TiPoT4USt6v7Ec6I+CwddRZbtUoh6mdb801iiXmYh6k8dEDUitQxRLwOa/lNSc9Gpj6z5M+HT1FIdGmiiXgrUEBm8y4X3Q/llOWG6BdZNIWrjQ/Qki/TOCuFErTRcQdBwOVDDzz0hamR+fSE8c1RPviBkzkoS+a0kErXRAn2GkH5aRdJ1lQOi7gbU4UvcPJnvkqi/BPfPXF+lEDf8FYGovxZO1Krurz0n6m64Lzv1smyXQtSrtebfxBL1agtRf+OAqBGpZYh6NdD035Cai059ZM3fCp+mVunQQBP1KqCGyOD9Tng/lF++I0y3wLopRG18iJ5kkd5ZI5yolYZrCBp+B9Twe0+IGplfPwjPHNWTHwiZs5ZEfmuJRG20QJ8hpJ/WkXRd54CozwTq8CNMhwKnf3vWj+D+meunFOKGfyIQ9c/CiVrV/bPnRH0mzGxRZ3971nqt+S+xRL3eQtS/OCBqRGoZol4PNP0vpOaiUx9Z86/Cp6l1OjTQRL0OqCEyeDcI74fyywbCdAusm0LUxofoSRbpnY3CiVppuJGg4Qaghr95QtTI/PpdeOaonvxOyJxNJPLbRCRqowX6DCH9tJmk62YHRH0GUIc/PCXqP8D9M9efKcQN/0kg6r+EE7Wq+y/PifoMD4l6i9b871ii3mIh6r8dEDUitQxRbwGa/m9PiBpZ8z/Cp6nNOjTQRL0ZqCEyeLcK74fyy1bCdAusm0LUxofoSRbpnW3CiVppuI2g4Vbk4JPqB1Ej82uPVNmZo3qi9og+0wnAXpefoRJSeURttECfIaSfEkm6Jqbyifp0oA7VYTrkOf1d39XB/TNXUipxw0mp+HWTU2UTtao7uRytgdZ1StSnw4aWXs5+13eK1jw1tdqO9JyS+m+iVv8Rm6hPBxJ1CtD0qamc5qJTH1lzmvBpKlGHBpqoE4EaIoM3XXg/lF/SCdMtsG4KURsfoidZpHcyyBpG4rv+c5YzCBqmAzWs4QlRI/OrpvDMUT2pScicTBL5ZRKJ2miBPkNIP2WRdM1yQNRdgURdC0fUJS6Juha4f+aqnUrccG0CUe8pnKhV3Xt6TtRdcUSdY9kuhajraM33iiXqOhai3ssBUXcFEnUdoOn3SuU0F536yJr3Fj5NZenQQBN1FlBDZPDuI7wfyi/7EKZbYN0UojY+RE+ySO/UFU7USsO6BA33AWq4rydEjcyv/YRnjurJfoTM2Z9EfvsTidpogT5DSD/VI+lazwFRnwYk6gNgOmQ7/Yz6AHD/zHVgKnHDBxKI+iDhRK3qPshzoj4NRtQlzj6jrq81bxBL1PUtRN3AAVGfBiTq+kDTN0jlNBed+siaDxY+TdXToYEm6npADZHB21B4P5RfGhKmW2DdFKI2PkRPskjvNBJO1ErDRgQNGwI1PMQTokbm16HCM0f15FBC5hxGIr/DiERttECfIaSfGpN0beyAqE8FEvXhMB1yclwS9eHg/pnriFTiho8gEPWRwola1X2k50R9Koyoi0ss26UQdROtedNYom5iIeqmDoj6VCBRNwGavmkqp7no1EfWfJTwaaqxDg00UTcGaogM3mbC+6H80oww3QLrphC18SF6kkV6p7lwolYaNido2AyoYcQTokbmVyA8c1RPAkLmZJPIL5tI1EYL9BlC+imHpGuOA6I+BUjUuTAdSp1+Rp0L7p+58lKJG84jEHW+cKJWded7TtSnwIg6cPYZdVRrXhBL1FELURc4IOpTgEQdBZq+IJXTXHTqI2suFD5N5ejQQBN1DlBDZPC2EN4P5ZcWhOkWWDeFqI0P0ZMs0jsthRO10rAlQcMWQA2P9oSokfl1jPDMUT05hpA5x5LI71giURst0GcI6adWJF1bOSDqLkCibg3TIdcpUbcG989cx6USN3wcgaiPF07Uqu7jPSfqLjCiLnJG1G205ifEEnUbC1Gf4ICouwCJug3Q9CekcpqLTn1kzScKn6Za6dBAE3UroIbI4G0rvB/KL20J0y2wbgpRGx+iJ1mkd9oJJ2qlYTuChm2BGp7kCVEj86u98MxRPWlPyJwOJPLrQCRqowX6DCH91JGka0cHRN0ZSNSdYDpEC10SdSdw/8x1cipxwycTiLqzcKJWdXf2nKg74/6KuahluxSi7qI1PyWWqLtYiPoUB0TdGUjUXYCmPyWV01z411GBNZ8qfJrqqEMDTdQdgRoig/c04f1QfjmNMN0C66YQtfEhepJFeqercKJWGnYlaHgaUMPTPSFqZH6dITxzVE/OIGTOmSTyO5NI1EYL9BlC+qkbSdduDoj6ZCBRn4X7hMYpUZ8F7p+5zk4lbvhsAlGfI5yoVd3neE7UJ8OIOtcZUXfXmp8bS9TdLUR9rgOiPhlI1N2Bpj83ldNcdOojaz5P+DTVTYcGmqi7ATVEBm8P4f1QfulBmG6BdVOI2vgQPckivdNTOFErDXsSNOwB1PB8T4gamV+9hGeO6kkvQuYUkciviEjURgv0GUL6qZika7EDou4EJOoS3GfUEZdEXQLun7lKU4kbLiUQdZlwolZ1l3lO1J1gRF0YsWyXQtS9teYXxBJ1bwtRX+CAqDsBibo30PQXpHKai059ZM0XCp+minVooIm6GKghMnj7CO+H8ksfwnQLrJtC1MaH6EkW6Z2+wolaadiXoGEfoIYXeULUyPy6WHjmqJ5cTMicS0jkdwmRqI0W6DOE9FM/kq79HBB1RyBRX4qbJwOXRH0puH/muiyVuOHLCER9uXCiVnVf7jlRd4QRdX6ZZbsUou6vNb8ilqj7W4j6CgdE3RFI1P2Bpr8ildNcdOoja75S+DTVT4cGmqj7ATVEBu8A4f1QfhlAmG6BdVOI2vgQPckivTNQOFErDQcSNBwA1PAqT4gamV9XC88c1ZOrCZlzDYn8riEStdECfYaQfhpE0nWQA6LuACTqa3Hf8+j0b8+6Ftw/c12XStzwdQSiHiycqFXdgz0n6g6430zm7G/PGqI1vz6WqIdYiPp6B0TdAUjUQ4Cmvz6V01x06iNrvkH4NDVIhwaaqAcBNUQG71Dh/VB+GUqYboF1U4ja+BA9ySK9M0w4USsNhxE0HArU8EZPiBqZXzcJzxzVk5sImTOcRH7DiURttECfIaSfRpB0HeGAqNsDifpmmA6lTj+jvhncP3Pdkkrc8C0Eor5VOFGrum/1nKjb4/72LGefUY/Umt8WS9QjLUR9mwOibg8k6pFA09+WymkuOvWRNd8ufJoaoUMDTdQjgBoig/cO4f1QfrmDMN0C66YQtfEhepJFemeUcKJWGo4iaHgHUMM7PSFqZH7dJTxzVE/uImTO3STyu5tI1EYL9BlC+mk0SdfRDoj6JCBR3wPToSzPJVHfA+6fue5NJW74XgJR3yecqFXd93lO1CfBiDpSZNkuhajHaM3vjyXqMRaivt8BUZ8EJOoxQNPfn8ppLjr1kTU/IHyaGq1DA03Uo4EaIoP3QeH9UH55kDDdAuumELXxIXqSRXpnrHCiVhqOJWj4IFDDhzwhamR+PSw8c1RPHiZkziMk8nuESNRGC/QZQvppHEnXcQ6Iuh2QqMfDdCh0+l3f48H9M9ejqcQNP0og6gnCiVrVPcFzom6H+zlqZ9/1PVFr/lgsUU+0EPVjDoi6HZCoJwJN/1gqp7no1EfW/LjwaWqcDg00UY8DaogM3knC+6H8Mokw3QLrphC18SF6kkV6Z7JwolYaTiZoOAmo4ROeEDUyv54UnjmqJ08SMmcKifymEInaaIE+Q0g/TSXpOtUBUbcFEvVTuM+onf6u76fA/TPX06nEDT9NIOppwola1T3Nc6Jui/uub2e/63u61vyZWKKebiHqZxwQdVsgUU8Hmv6ZVE5z0amPrPlZ4dPUVB0aaKKeCtQQGbzPCe+H8stzhOkWWDeFqI0P0ZMs0jszhBO10nAGQcPngBo+7wlRI/PrBeGZo3ryAiFzXiSR34tEojZaoM8Q0k8zSbrO1Lq6pMsTU7C1mOulVOKGXyLQ5cvC6VLV/TKBLm17RRyQlwmHGHjw6P2WqiGy7lmeDBMzgTXPFj5MqFpnEYaJV4QP36ovr5AzJ14NXyUNDq/+HwwOJ5AGhzmpxA3PIQwOc4UPDqruuZ4MDsrIcwmHGHjw6P2WqiGy7tc8GRxeBdb8uvDBQdX6GmFwmCd8cFB9mUfOnHg1nE8aHOY7+Ay/DfAz/DeAZ8jlsPRGKmdYejOVuOE3CcPSAuHDkqp7gaNhKRLfFczXe0V/dDgf2CNkvxcKf4GqoFtIeIG+JfwFqmp+i1D326SX3tuWbwFBa8LuGeKMLyAMPcjz/o5w3ysN3yFouBCo4SJPQAv5znlX+HtC9eRdQl6+R8rL94gf9+5Mi0h8V4D0kwKF1Grb56zyF3rfh1fjnNdq0H1mU7+3s7zXGug/Lw4b8EF4fxjeS8J7aXh/FN4fh/cn4b0svD8N78/Ce3l4rwjvz8P7i/BeGd6rwvvL8P4qvL8O79Xh/U14fxve34X3mvD+Prx/CO+14b0uvH8M75/C++fUajt+D+liPUCUf/aB5dmHlmdLLM+WWp59ZHn2seXZJ5ZnyyzPPrU8+8zybLnl2QrLs88tz76wPFtpebbK8uxLy7OvLM++tjxbbXn2jeXZt5Zn31merbE8+97y7AfLs7WWZ+ssz360PPvJ8uzn1H8Pqwfrf7bW/4zEd+0QOvGG5WJA8Jrvff4AtJaq8UPIWv/Va0n8a2VrvYKl8a6V+z/tg4/iWytSro/Bx/Gslb2DJ4JPqr5WJMZfwbIqrpVf9i+vBp9Wba0Ci++Dz6qyVoH1DAXLK79WdCfnMVhR2bWiOz3bweeVWyt7FzkRfFGZtaK7zJxgZcXXKt5NfgWrKrpWdLdZGHxZsbUiFcjV4KuKrBWpUEYHX+9+rbwK5n2wendr5Vb43RF8s8u1cssq8R4Kvt3VWtFKvdOC73a+VkEl34/Bmp2sVVhW6Xdt8L19rUgV3tvBD7a1IlWaAYK1/14rqOI8EayLXaukyrNJ8OOOa+XEMecEP5VbK7ssrpkp+DnVjy/S/JyKW2s9rOYcpz+Nux7Yq/L7/SWVuGG1OHrdX4FmYNX9azlyAq3r9KdxccFQ4uyncTdozTfGkuwGbcLyzzam8n8aF5Fahkg3AE2/EdxcxgHfkIr/MvUGT952PwF7/Rus5vxcl2+730hvu99TiRv+nfC22yT8bafq3uT52+4nmNkKiy3bpbztNmvN/4h92222vO3+cPC2+wn4ttsMNP0fpOaiUx9Z85+49LR+EB3v/n7VoYH+BgYkGvwFnhbQoaV6/BdhSpJet/EOuu4tnkyHSI//Tc6JSHxXoHryNyEn/gJq+I8H5+UfwnnZCp7QzayytdxeWVqg/fQ30E/bSLpuS+X/xMWPSFhJQ+mQW+qSXHH73pFc90gjblgtjl43IU02uaq6E9K2Cwxa1ym5/ggLi6Jsy3Yp5JqoNa+eVm1HSk1M+ze5qv+ITa4/Ask1EWj66mmc5qJTH1lzUhrwgFfDHzj1FlWhgf7Rp23ANycyeJOF90P5JTkNP90C66b8GI3xIXqSRXonhaxhJL7rP2c5haBhMlDDVLCG5kK/A5D5lSY8c1RP0giZkw4mBzNDpafxiNpogT5DSD9lkHTNSOMT9TqgDjVgOkSzXRJ1DXD/zFUzjbjhmgSizhRO1KruTM+Jeh2MqAtKLdulEHWW1rxWLFFnWYi6lgOiXgck6iyg6WulcZqLTn1kzbWFT1MZOjTQRJ0B1BAZvHsK74fyy56E6XZPMMmg92d8iJ5kkd6pI5yolYZ1CBruCdRwL0+IGplfewvPHNWTvQmZsw+J/PYhErXRAn2GkH6qS9K1rgOiXgsk6n1hOpQ6/a2A+4L7Z6790ogb3o9A1PsLJ2pV9/6eE/VaGFEHZZbtUoi6ntb8gFiirmch6gMcEPVaIFHXA5r+gDROc9Gpj6z5QOHTVF0dGmiirgvUEBm8Bwnvh/LLQYTpFlg3haiND9GTLNI79YUTtdKwPkHDg4AaNvCEqJH5dbDwzFE9OZiQOQ1J5NeQSNRGC/QZQvqpEUnXRg6I+gcgUR8C0yHHKVEfAu6fuQ5NI274UAJRHyacqFXdh3lO1D/AiLrYGVE31pofHkvUjS1EfbgDov4BSNSNgaY/PI3TXHTqI2s+Qvg01UiHBpqoGwE1RAbvkcL7ofxyJGG6BdZNIWrjQ/Qki/ROE+FErTRsQtDwSKCGTT0hamR+HSU8c1RPjiJkTjMS+TUjErXRAn2GkH5qTtK1uQOi/h5I1BGYDr2c/r7LCLh/5grSiBsOCESdLZyoVd3ZnhP197hfk+fs913maM1zY4k6x0LUuQ6I+nsgUecATZ+bxmkuOvWRNecJn6aa69BAE3VzoIbI4M0X3g/ll3zCdAusm0LUxofoSRbpnahwolYaRgka5gM1LPCEqJH5VSg8c1RPCgmZ04JEfi2IRG20QJ8hpJ9aknRt6YCo1wCJ+miYDtmFLon6aHD/zHVMGnHDxxCI+ljhRK3qPtZzol6D+0sGopbtUoi6lda8dSxRt7IQdWsHRL0GSNStgKZvncZpLjr1kTUfJ3yaaqlDA03ULYEaIoP3eOH9UH45njDdAuumELXxIXqSRXqnjXCiVhq2IWh4PFDDEzwhamR+nSg8c1RPTiRkTlsS+bUlErXRAn2GkH5qR9K1nQOi/g5I1CfBdCgqcEnUJ4H7Z672acQNtycQdQfhRK3q7uA5UX8HI+rcAst2KUTdUWveKZaoO1qIupMDov4OSNQdgabvlMZpLjr1kTWfLHyaaqdDA03U7YAaIoO3s/B+KL90Jky3wLopRG18iJ5kkd7pIpyolYZdCBp2Bmp4iidEjcyvU4VnjurJqYTMOY1EfqcRidpogT5DSD91Jena1QFRfwsk6tNhOuQ5/a7v08H9M9cZacQNn0Eg6jOFE7Wq+0zPifpb3N+e5ey7vrtpzc+KJepuFqI+ywFRfwsk6m5A05+VxmkuOvWRNZ8tfJrqqkMDTdRdgRoig/cc4f1QfjmHMN0C66YQtfEhepJFeqe7cKJWGnYnaHgOUMNzPSFqZH6dJzxzVE/OI2RODxL59SAStdECfYaQfupJ0rWnA6L+BkjU5+M+oclzSdTng/tnrl5pxA33IhB1kXCiVnUXeU7U3+CIusiyXQpRF2vNS2KJuthC1CUOiPobIFEXA01fksZpLjr1kTWXCp+meurQQBN1T6CGyOAtE94P5ZcywnQLrJtC1MaH6EkW6Z3ewolaadiboGEZUMMLPCFqZH5dKDxzVE8uJGROHxL59SEStdECfYaQfupL0rWvA6JeDSTqi3DzZL5Lor4I3D9zXZxG3PDFBKK+RDhRq7ov8ZyoV+O+67uXZbsUou6nNb80lqj7WYj6UgdEvRpI1P2Apr80jdNcdOoja75M+DTVV4cGmqj7AjVEBu/lwvuh/HI5YboF1k0hauND9CSL9E5/4UStNOxP0PByoIZXeELUyPy6UnjmqJ5cScicASTyG0AkaqMF+gwh/TSQpOtAB0T9NZCor4LpUOD0b8+6Ctw/c12dRtzw1QSivkY4Uau6r/GcqL+GEXXU2d+eNUhrfm0sUQ+yEPW1Doj6ayBRDwKa/to0TnPRqY+s+Trh09RAHRpooh4I1BAZvIOF90P5ZTBhugXWTSFq40P0JIv0zhDhRK00HELQcDBQw+s9IWpkft0gPHNUT24gZM5QEvkNJRK10QJ9hpB+GkbSdZgDov4KSNQ3ekrUN4L7Z66b0ogbvolA1MOFE7Wqe7jnRP2Vh0Q9Qmt+cyxRj7AQ9c0OiPorIFGPAJr+Zk+IGlnzLcKnqWE6NNBEPQyoITJ4bxXeD+WXWwnTLbBuClEbH6InWaR3RgonaqXhSIKGtwI1vM0Tokbm1+3CM0f15HZC5txBIr87iERttECfIaSfRpF0HeWAqL8EEvWdMB3ynP6u7zvB/TPXXWnEDd9FIOq7hRO1qvtuz4n6SxhR93L2u75Ha83viSXq0RaivscBUX8JJOrRQNPfk8ZpLjr1kTXfK3yaGqVDA03Uo4AaIoP3PuH9UH65jzDdAuumELXxIXqSRXpnjHCiVhqOIWh4H1DD+z0hamR+PSA8c1RPHiBkzoMk8nuQSNRGC/QZQvppLEnXsQ6IehWQqB/CEXWJS6J+CNw/cz2cRtzwwwSifkQ4Uau6H/GcqFfhiDrHsl0KUY/Tmo+PJepxFqIe74CoVwGJehzQ9OPTOM1Fpz6y5keFT1NjdWigiXosUENk8E4Q3g/llwmE6RZYN4WojQ/RkyzSOxOFE7XScCJBwwlADR/zhKiR+fW48MxRPXmckDmTSOQ3iUjURgv0GUL6aTJJ18kOiHolkKifgOmQ7fQz6ifA/TPXk2nEDT9JIOopwola1T3Fc6JeCSPqEmefUU/Vmj8VS9RTLUT9lAOiXgkk6qlA0z+VxmkuOvWRNT8tfJqarEMDTdSTgRoig3ea8H4ov0wjTLfAuilEbXyInmSR3pkunKiVhtMJGk4DaviMJ0SNzK9nhWeO6smzhMx5jkR+zxGJ2miBPkNIP80g6TrDAVF/ASTq52E65OS4JOrnwf0z1wtpxA2/QCDqF4UTtar7Rc+J+gsYUReXWLZLIeqZWvOXYol6poWoX3JA1F8AiXom0PQvpXGai059ZM0vC5+mZujQQBP1DKCGyOCdJbwfyi+zCNMtsG4KURsfoidZpHdmCydqpeFsgoazgBq+4glRI/PrVeGZo3ryKiFz5pDIbw6RqI0W6DOE9NNckq5zHRD150Cifg2mQ6nTz6hfA/fPXK+nETf8OoGo5wknalX3PM+J+nMYUQfOPqOerzV/I5ao51uI+g0HRP05kKjnA03/RhqnuejUR9b8pvBpaq4ODTRRzwVqiAzeBcL7ofyygDDdAuumELXxIXqSRXpnoXCiVhouJGi4AKjhW54QNTK/3haeOaonbxMy5x0S+b1DJGqjBfoMIf20iKTrIgdEvQJI1O/CdMh1StTvgvtnrvfSiBt+j0DU7wsnalX3+54T9QoYURc5I+rFWvMPYol6sYWoP3BA1CuARL0YaPoP0jjNRac+suYPhU9Ti3RooIl6EVBDZPAuEd4P5ZclhOkWWDeFqI0P0ZMs0jtLhRO10nApQcMlQA0/8oSokfn1sfDMUT35mJA5n5DI7xMiURst0GcI6adlJF2XOSDq5UCi/hSmQ7TQJVF/Cu6fuT5LI274MwJRLxdO1Kru5Z4T9XIYURdELdulEPUKrfnnsUS9wkLUnzsg6uVAol4BNP3naZzmwr+OCqz5C+HT1DIdGmiiXgbUEBm8K4X3Q/llJWG6BdZNIWrjQ/Qki/TOKuFErTRcRdBwJVDDLz0hamR+fSU8c1RPviJkztck8vuaSNRGC/QZQvppNUnX1Q6I+jMgUX+D+4TGKVF/A+6fub5NI274WwJRfyecqFXd33lO1J/BiDrXGVGv0Zp/H0vUayxE/b0Dov4MSNRrgKb/Po3TXHTqI2v+Qfg0tVqHBpqoVwM1RAbvWuH9UH5ZS5hugXVTiNr4ED3JIr2zTjhRKw3XETRcC9TwR0+IGplfPwnPHNWTnwiZ8zOJ/H4mErXRAn2GkH5aT9J1vQOi/hRI1L/gPqOOuCTqX8D9M9evacQN/0og6g3CiVrVvcFzov4URtSFEct2KUS9UWv+WyxRb7QQ9W8OiPpTIFFvBJr+tzROc9Gpj6z5d+HT1HodGmiiXg/UEBm8m4T3Q/llE2G6BdZNIWrjQ/Qki/TOZuFErTTcTNBwE1DDPzwhamR+/Sk8c1RP/iRkzl8k8vuLSNRGC/QZQvppC0nXLQ6IehmQqP/GzZOBS6L+G9w/c/2TRtzwPwSi3iqcqFXdWz0n6mUwos4vs2yXQtTbjObp1Xak520Wolb/EZuolwGJehvS9Omc5qJTH1nzHumyp6ktOjTQRL0FqCEyeBOE90P5Re0RPd0C66YQtfEhepJFeieRrGEkvus/Z1ntEa1hee/Eq2F1sIbmQr8DkPmVJDxzVE+SCJmTDOx1+RkqOZ1H1EYL9BlC+imFpGtKOp+oPwESdSpMh1ynf3tWKrh/5kpLJ244LR2/bjrwxcKqOz19u8CgdZ0S9Se430zm7G/PytCa14gl6oz0fxN1DQdE/QmQqDOApq+RzmkuOvWRNdcUPk2l6NBAE3UKUENk8GYK74fySyZhus0Ekwx6f8aH6EkW6Z0s4UStNMwiaJgJ1LCWJ0SNzK/awjNH9aQ2IXP2JJHfnkSiNlqgzxDST3VIutZxQNQfA4l6L5gOpU4/o94L3D9z7Z1O3PDeBKLeRzhRq7r38ZyoP8b97VnOPqOuqzXfN5ao61qIel8HRP0xkKjrAk2/bzqnuejUR9a8n/Bpqo4ODTRR1wFqiAze/YX3Q/llf8J0C6ybQtTGh+hJFumdesKJWmlYj6Dh/kAND/CEqJH5daDwzFE9OZCQOQeRyO8gIlEbLdBnCOmn+iRd6zsg6o+ARN0ApkNZnkuibgDun7kOTidu+GACUTcUTtSq7oaeE/VHMKKOFFm2SyHqRlrzQ2KJupGFqA9xQNQfAYm6EdD0h6RzmotOfWTNhwqfpurr0EATdX2ghsjgPUx4P5RfDiNMt8C6KURtfIieZJHeaSycqJWGjQkaHgbU8HBPiBqZX0cIzxzVkyMImXMkifyOJBK10QJ9hpB+akLStYkDol4KJOqmMB0KnX7Xd1Nw/8x1VDpxw0cRiLqZcKJWdTfznKiX4n6O2tl3fTfXmkdiibq5hagjDoh6KZComwNNH0nnNBed+siaA+HTVBMdGmiibgLUEBm82cL7ofySTZhugXVTiNr4ED3JIr2TI5yolYY5BA2zgRrmekLUyPzKE545qid5hMzJJ5FfPpGojRboM4T0U5Ska9QBUS8BEnUB7jNqp7/ruwDcP3MVphM3XEgg6hbCiVrV3cJzol6C+65vZ7/ru6XW/OhYom5pIeqjHRD1EiBRtwSa/uh0TnPRqY+s+Rjh01RUhwaaqKNADZHBe6zwfii/HEuYboF1U4ja+BA9ySK900o4USsNWxE0PBaoYWtPiBqZX8cJzxzVk+MImXM8ifyOJxK10QJ9hpB+akPStY3W1SVdfpiKrcVcJ6QTN3wCgS5PFE6Xqu4TCXRp2yvigJxIOMTAg0fvt1QNkXW39WSYaAOsuZ3wYULV2pYwTJwkfPhWfTmJnDnxatieNDi0/z8YHD4gDQ4d0okb7kAYHDoKHxxU3R09GRyUkTsSDjHw4NH7LVVDZN2dPBkc2gNrPln44KBq7UQYHDoLHxxUXzqTMydeDbuQBocuDj7DXwz8DP8U4BlyOSydks4Zlk5NJ274VMKwdJrwYUnVfZqjYSkS3xV00XtFf3TYBdgjZL+7Cn+BqqDrSniBni78BapqPp1Q9xmkl94Zlm8BQWvC7hnijJ9GGHqQ5/1M4b5XGp5J0LArUMNunoAW8p1zlvD3hOrJWYS8PJuUl2cTP+7dmRaR+K4A6ScFCqnVts9Z5S/0vo+oxjmv1aD7zKZ+b2d5rzXQf+4e9vPc8D4vvHuEd8/wPj+8e4V3UXgXh3dJeJeGd1l49w7vC8L7wvDuE959w/ui8L44vC8J737hfWl4Xxbel4d3//C+IryvDO8B4T0wvK8K76vD+5r0ajt+D2l3PUCUf3au5dl5lmc9LM96Wp6db3nWy/KsyPKs2PKsxPKs1PKszPKst+XZBZZnF1qe9bE862t5dpHl2cWWZ5dYnvWzPLvU8uwyy7PLLc/6W55dYXl2peXZAMuzgZZnV1meXW15do1lWD1Y/7O1/mckvmuH0Ik3LLsDgtd87/O5oLVUjedB1vqvXj3iXytb6xX0jHet3P9pH5wf31qRcn0MesWzVvYOngiKqr5WJMZfQXEV18ov+5dXg5KqrVVg8X1QWpW1CqxnKCir/FrRnZzHoHdl14ru9GwHF1Rurexd5ERwYWXWiu4yc4I+FV+reDf5FfSt6FrR3WZhcFHF1opUIFeDiyuyVqRCGR1csvu18iqY90G/3a2VW+F3R3DpLtfKLavEeyi4bFdrRSv1Tgsu3/laBZV8Pwb9d7JWYVml37XBFfa1IlV4bwdX2taKVGkGCAb8e62givNEMDB2rZIqzybBVTuulRPHnBNcXW6t7LK4ZqbgGk++SHNNOm6tQbCac5z+NO4gYK/K7/fadOKGryV8heU6oBlYdV+Xvl1g0LpOfxoXFwwlzn4ad7DWfEjsV00GaxOWfzYknf/TuIjUMkQ6GGj6IeDmMg744HT8l6kHe/K2uxrY6+thNefnunzbXU96292QTtzwDYS33VDhbztV91DP33ZXw8xWWGzZLuVtN0xrfmPs226Y5W13o4O33dXAt90woOlvJDUXnfrImm/Cpaf1g+h493edDg30NzAg0WA4eFpAh5bq8XDClCS9buMddN0jPJkOkR6/mZwTkfiuQPXkZkJODAdqeIsH5+UWwnm5FTyhm1nl1nJ7ZWmB9tPNQD+NJOk6Mp3/ExdXAXW4DaZDbqlLcr0N3D9z3Z5O3PDtBHK9Qzi5qrrv8Jxcr4KZrSjbsl0KuY7Smt8ZS66jLOR6pwNyRaSWIddRQNPfSWouOvWRNd8lfCIdqUMD/aNPI4EaIoP3buH9UH65mzDdAuum/BiN8SF6kkV6Z7RwMlIajiZoeDdQw3s8+aoEMr/uFZ45qif3EjLnPhL53UckaqMF+gwh/TSGpOsYB0Q9EKjD/TAdotkuifp+cP/M9UA6ccMPEIj6QeFErep+0HOiHggzW0GpZbsUoh6rNX8olqjHWoj6IQdEjUgtQ9RjgaZ/iNRcdOoja35Y+DQ1RocGmqjHADVEBu8jwvuh/PIIYboF1k0hauND9CSL9M444UStNBxH0PARoIbjPSFqZH49KjxzVE8eJWTOBBL5TSAStdECfYaQfppI0nWiA6IeANThMZgOpU5/K+Bj4P6Z6/F04oYfJxD1JOFEreqe5DlRD4CZLSizbJdC1JO15k/EEvVkC1E/4YCoEalliHoy0PRPkJqLTn1kzU8Kn6Ym6tBAE/VEoIbI4J0ivB/KL1MI0y2wbgpRGx+iJ1mkd6YKJ2ql4VSChlOAGj7lCVEj8+tp4ZmjevI0IXOmkchvGpGojRboM4T003SSrtMdEPWVQB2egemQ45SonwH3z1zPphM3/CyBqJ8TTtSq7uc8J+orYWYrdkbUM7Tmz8cS9QwLUT/vgKgRqWWIegbQ9M+TmotOfWTNLwifpqbr0EAT9XSghsjgfVF4P5RfXiRMt8C6KURtfIieZJHemSmcqJWGMwkavgjU8CVPiBqZXy8LzxzVk5cJmTOLRH6ziERttECfIaSfZpN0ne2AqK8A6vAKTIdeTn/f5Svg/pnr1XTihl8lEPUc4USt6p7jOVFfATNbvrPfdzlXa/5aLFHPtRD1aw6IGpFahqjnAk3/Gqm56NRH1vy68Glqtg4NNFHPBmqIDN55wvuh/DKPMN0C66YQtfEhepJFeme+cKJWGs4naDgPqOEbnhA1Mr/eFJ45qidvEjJnAYn8FhCJ2miBPkNIPy0k6brQAVH3B+rwFkyH7EKXRP0WuH/mejuduOG3CUT9jnCiVnW/4zlR94eZrSRq2S6FqBdpzd+NJepFFqJ+1wFRI1LLEPUioOnfJTUXnfrImt8TPk0t1KGBJuqFQA2Rwfu+8H4ov7xPmG6BdVOI2vgQPckivbNYOFErDRcTNHwfqOEHnhA1Mr8+FJ45qicfEjJnCYn8lhCJ2miBPkNIPy0l6brUAVFfDtThI5gORQUuifojcP/M9XE6ccMfE4j6E+FErer+xHOivhxmttwCy3YpRL1Ma/5pLFEvsxD1pw6IGpFahqiXAU3/Kam56NRH1vyZ8GlqqQ4NNFEvBWqIDN7lwvuh/LKcMN0C66YQtfEhepJFemeFcKJWGq4gaLgcqOHnnhA1Mr++EJ45qidfEDJnJYn8VhKJ2miBPkNIP60i6brKAVFfBtThS5gOeU6/6/tLcP/M9VU6ccNfEYj6a+FErer+2nOivgz3ZSdn3/W9Wmv+TSxRr7YQ9TcOiBqRWoaoVwNN/w2puejUR9b8rfBpapUODTRRrwJqiAze74T3Q/nlO8J0C6ybQtTGh+hJFumdNcKJWmm4hqDhd0ANv/eEqJH59YPwzFE9+YGQOWtJ5LeWSNRGC/QZQvppHUnXdQ6I+lKgDj/iPqHJc0nUP4L7Z66f0okb/olA1D8LJ2pV98+eE/WlOOgqsmyXQtTrtea/xBL1egtR/+KAqBGpZYh6PdD0v5Cai059ZM2/Cp+m1unQQBP1OqCGyODdILwfyi8bCNMtsG4KURsfoidZpHc2CidqpeFGgoYbgBr+5glRI/Prd+GZo3ryOyFzNpHIbxORqI0W6DOE9NNmkq6bHRB1P6AOf+DmyXyXRP0HuH/m+jOduOE/CUT9l3CiVnX/5TlR98N92amXZbsUot6iNf87lqi3WIj6bwdEjUgtQ9RbgKb/m9RcdOoja/5H+DS1WYcGmqg3AzVEBu9W4f1QftlKmG6BdVOI2vgQPckivbNNOFErDbcRNNyKHHwy/CBqZH7tkSE7c1RP1B7RZzoB2OvyM1RCBo+ojRboM4T0UyJJ18QMPlFfAtShOkyHAqd/e1Z1cP/MlZRB3HBSBn7d5AzZRK3qTs7YLjBoXadEfQlsaIk6+9uzUrTmqRnVdqTnlIx/E7X6j9hEfQmQqFOApk/N4DQXnfrImtOET1OJOjTQRJ0I1BAZvOnC+6H8kk6YbtPBJIPen/EhepJFeieDrGEkvus/ZzmDoGE6UMManhA1Mr9qCs8c1ZOahMzJJJFfJpGojRboM4T0UxZJ1ywHRH0xkKhreUrUtcD9M1ftDOKGaxOIek/hRK3q3tNzor7YQ6KuozXfK5ao61iIei8HRH0xkKjrAE2/lydEjax5b+HTVJYODTRRZwE1RAbvPsL7ofyyD2G6BdZNIWrjQ/Qki/ROXeFErTSsS9BwH6CG+3pC1Mj82k945qie7EfInP1J5Lc/kaiNFugzhPRTPZKu9RwQ9UVAoj4ApkOe09/1fQC4f+Y6MIO44QMJRH2QcKJWdR/kOVFfBCPqXs5+13d9rXmDWKKubyHqBg6I+iIgUdcHmr5BBqe56NRH1nyw8Gmqng4NNFHXA2qIDN6Gwvuh/NKQMN0C66YQtfEhepJFeqeRcKJWGjYiaNgQqOEhnhA1Mr8OFZ45qieHEjLnMBL5HUYkaqMF+gwh/dSYpGtjB0TdF0jUh+OIusQlUR8O7p+5jsggbvgIAlEfKZyoVd1Hek7UfXFEnWPZLoWom2jNm8YSdRMLUTd1QNR9gUTdBGj6phmc5qJTH1nzUcKnqcY6NNBE3RioITJ4mwnvh/JLM8J0C6ybQtTGh+hJFumd5sKJWmnYnKBhM6CGEU+IGplfgfDMUT0JCJmTTSK/bCJRGy3QZwjppxySrjkOiLoPkKhzYTpkO/2MOhfcP3PlZRA3nEcg6nzhRK3qzvecqPvAiLrE2WfUUa15QSxRRy1EXeCAqPsAiToKNH1BBqe56NRH1lwofJrK0aGBJuocoIbI4G0hvB/KLy0I0y2wbgpRGx+iJ1mkd1oKJ2qlYUuChi2AGh7tCVEj8+sY4ZmjenIMIXOOJZHfsUSiNlqgzxDST61IurZyQNQXAom6NUyHnByXRN0a3D9zHZdB3PBxBKI+XjhRq7qP95yoL4QRdXGJZbsUom6jNT8hlqjbWIj6BAdEfSGQqNsATX9CBqe56NRH1nyi8GmqlQ4NNFG3AmqIDN62wvuh/NKWMN0C66YQtfEhepJFeqedcKJWGrYjaNgWqOFJnhA1Mr/aC88c1ZP2hMzpQCK/DkSiNlqgzxDSTx1JunZ0QNQXAIm6E0yHUqefUXcC989cJ2cQN3wygag7CydqVXdnz4n6AhhRB84+o+6iNT8llqi7WIj6FAdEfQGQqLsATX9KBqe56NRH1nyq8Gmqow4NNFF3BGqIDN7ThPdD+eU0wnQLrJtC1MaH6EkW6Z2uwolaadiVoOFpQA1P94Sokfl1hvDMUT05g5A5Z5LI70wiURst0GcI6aduJF27OSDq3kCiPgumQ65Toj4L3D9znZ1B3PDZBKI+RzhRq7rP8Zyoe+P+0nZnRN1da35uLFF3txD1uQ6IujeQqLsDTX9uBqe56NRH1nye8Gmqmw4NNFF3A2qIDN4ewvuh/NKDMN0C66YQtfEhepJFeqencKJWGvYkaNgDqOH5nhA1Mr96Cc8c1ZNehMwpIpFfEZGojRboM4T0UzFJ12IHRF0GJOoSmA7RQpdEXQLun7lKM4gbLiUQdZlwolZ1l3lO1GUwoi6IWrZLIereWvMLYom6t4WoL3BA1GVAou4NNP0FGZzmwr+OCqz5QuHTVLEODTRRFwM1RAZvH+H9UH7pQ5hugXVTiNr4ED3JIr3TVzhRKw37EjTsA9TwIk+IGplfFwvPHNWTiwmZcwmJ/C4hErXRAn2GkH7qR9K1nwOiLgUS9aW4T2icEvWl4P6Z67IM4oYvIxD15cKJWtV9uedEXQoj6lxnRN1fa35FLFH3txD1FQ6IuhRI1P2Bpr8ig9NcdOoja75S+DTVT4cGmqj7ATVEBu8A4f1QfhlAmG6BdVOI2vgQPckivTNQOFErDQcSNBwA1PAqT4gamV9XC88c1ZOrCZlzDYn8riEStdECfYaQfhpE0nWQA6IuARL1tbjPqCMuifpacP/MdV0GccPXEYh6sHCiVnUP9pyoS2BEXRixbJdC1EO05tfHEvUQC1Ff74CoS4BEPQRo+uszOM1Fpz6y5huET1ODdGigiXoQUENk8A4V3g/ll6GE6RZYN4WojQ/RkyzSO8OEE7XScBhBw6FADW/0hKiR+XWT8MxRPbmJkDnDSeQ3nEjURgv0GUL6aQRJ1xEOiLoYSNQ34+bJwCVR3wzun7luySBu+BYCUd8qnKhV3bd6TtTFMKLOL7Nsl0LUI7Xmt8US9UgLUd/mgKiLgUQ9Emj62zI4zUWnPrLm24VPUyN0aKCJegRQQ2Tw3iG8H8ovdxCmW2DdFKI2PkRPskjvjBJO1ErDUQQN7wBqeKcnRI3Mr7uEZ47qyV2EzLmbRH53E4naaIE+Q0g/jSbpOtoBURcBifoe3Pc8Ov3bs+4B989c92YQN3wvgajvE07Uqu77PCfqItxvJnP2t2eN0ZrfH0vUYyxEfb8Doi4CEvUYoOnvz+A0F536yJofED5NjdahgSbq0UANkcH7oPB+KL88SJhugXVTiNr4ED3JIr0zVjhRKw3HEjR8EKjhQ54QNTK/HhaeOaonDxMy5xES+T1CJGqjBfoMIf00jqTrOAdE3QtI1ONhOpQ6/Yx6PLh/5no0g7jhRwlEPUE4Uau6J3hO1L1wf3uWs8+oJ2rNH4sl6okWon7MAVH3AhL1RKDpH8vgNBed+siaHxc+TY3ToYEm6nFADZHBO0l4P5RfJhGmW2DdFKI2PkRPskjvTBZO1ErDyQQNJwE1fMITokbm15PCM0f15ElC5kwhkd8UIlEbLdBnCOmnqSRdpzog6vOBRP0UTIeyPJdE/RS4f+Z6OoO44acJRD1NOFGruqd5TtTnw4g6UmTZLoWop2vNn4kl6ukWon7GAVGfDyTq6UDTP5PBaS469ZE1Pyt8mpqqQwNN1FOBGiKD9znh/VB+eY4w3QLrphC18SF6kkV6Z4ZwolYaziBo+BxQw+c9IWpkfr0gPHNUT14gZM6LJPJ7kUjURgv0GUL6aSZJ15kOiLonkKhfgulQ6PS7vl8C989cL2cQN/wygahnCSdqVfcsz4m6J+7nqJ191/dsrfkrsUQ920LUrzgg6p5Aop4NNP0rGZzmolMfWfOrwqepmTo00EQ9E6ghMnjnCO+H8sscwnQLrJtC1MaH6EkW6Z25wolaaTiXoOEcoIaveULUyPx6XXjmqJ68TsiceSTym0ckaqMF+gwh/TSfpOt8B0TdA0jUb+A+o3b6u77fAPfPXG9mEDf8JoGoFwgnalX3As+Jugfuu76d/a7vhVrzt2KJeqGFqN9yQNQ9gES9EGj6tzI4zUWnPrLmt4VPU/N1aKCJej5QQ2TwviO8H8ov7xCmW2DdFKI2PkRPskjvLBJO1ErDRQQN3wFq+K4nRI3Mr/eEZ47qyXuEzHmfRH7vE4naaIE+Q0g/LSbpuljr6pIuz0vH1mKuDzKIG/6AQJcfCqdLVfeHBLq07RVxQD4kHGLgwaP3W6qGyLqXeDJMLAbWvFT4MKFqXUIYJj4SPnyrvnxEzpx4NfyYNDh8/H8wOJxLGhw+ySBu+BPC4LBM+OCg6l7myeCgjLyMcIiBB4/eb6kaIuv+1JPB4WNgzZ8JHxxUrZ8SBoflwgcH1Zfl5MyJV8MVpMFhhYPP8LsDP8P/HHiGXA5Ln2dwhqUvMogb/oIwLK0UPiypulc6GpYi8V3BCr1X9EeHK4A9QvZ7lfAXqAq6VYQX6JfCX6Cq5i8JdX9Feul9ZfkWELQm7J4hzvhKwtCDPO9fC/e90vBrgoargBqu9gS0kO+cb4S/J1RPviHk5bekvPyW+HHvzrSIxHcFSD8pUEittn3OKn+h992kGue8VoPuM5v6vZ3lvdZA/3lN2M/vw/uH8F4b3uvC+8fw/im8fw7v9eH9S3j/Gt4bwntjeP8W3r+H96bw3hzef4T3n+H9V3hvCe+/w/uf8N4a3tvUzF8j/N8M74TwTgzv6uGdFN7JNart+D2ka/QAUf7Z95ZnP1ierbU8W2d59qPl2U+WZz9bnq23PPvF8uxXy7MNlmcbLc9+szz73fJsk+XZZsuzPyzP/rQ8+8vybIvl2d+WZ/9Ynm21PNtmeabMEftsD8uzBMuzRMuz6pZnSZZnyTX+PawerP/ZWv8zEt+1Q+jEG5ZrAMFrvvf5e9BaqsYfIGv9V6+18a+VrfUK1sW7Vu7/tA9+jG+tSLk+Bj/Fs1b2Dp4Ifq76WpEYfwXrq7hWftm/vBr8UrW1Ciy+D36tyloF1jMUbKj8WtGdnMdgY2XXiu70bAe/VW6t7F3kRPB7ZdaK7jJzgk0VX6t4N/kVbK7oWtHdZmHwR8XWilQgV4M/K7JWpEIZHfy1+7XyKpj3wZbdrZVb4XdH8Pcu18otq8R7KPhnV2tFK/VOC7bufK2CSr4fg207WauwrNLv2kDNJJa1IlV4bwd72NaKVGkGCBL+vVZQxXkiSIxdq6TKs0lQfce1cuKYc4Kkcmtll8U1MwXJNfz4Ik1yDdxaKbCac5z+NG4KsFfl95tag7hhtTh63TSgGVh1p9XYLjBoXac/jYsLhhJnP42brjXPiP2qSbo2YflnGTX4P42LSC1DpOlA02eAm8s44Ok18F+mTvfkbZcE7HUNWM35uS7fdjVIb7uaNYgbrkl422UKf9upujM9f9slwcxWWGzZLuVtl6U1rxX7tsuyvO1qOXjbJQHfdllA09ciNRed+siaa+PS0/pBdLz7S9Ohgf4GBiQa7AmeFtChpXq8J2FKkl638Q667jqeTIdIj+9FzolIfFegerIXISf2BGq4twfnZW/CedkHPKGbWWWfcntlaYH2015AP9Ul6Vq3Bv8nLqoDddgXpkNuqUty3RfcP3PtV4O44f0I5Lq/cHJVde/vOblWh5mtKNuyXQq51tOaHxBLrvUs5HqAA3JFpJYh13pA0x9Aai469ZE1Hyh8Iq2rQwP9o091gRoig/cg4f1QfjmIMN0C66b8GI3xIXqSRXqnvnAyUhrWJ2h4EFDDBp58VQKZXwcLzxzVk4MJmdOQRH4NiURttECfIaSfGpF0beSAqBOBOhwC0yGa7ZKoDwH3z1yH1iBu+FACUR8mnKhV3Yd5TtSJMLMVlFq2SyHqxlrzw2OJurGFqA93QNSI1DJE3Rho+sNJzUWnPrLmI4RPU410aKCJuhFQQ2TwHim8H8ovRxKmW2DdFKI2PkRPskjvNBFO1ErDJgQNjwRq2NQTokbm11HCM0f15ChC5jQjkV8zIlEbLdBnCOmn5iRdmzsg6gSgDhGYDqVOfytgBNw/cwU1iBsOCESdLZyoVd3ZnhN1AsxsQZlluxSiztGa58YSdY6FqHMdEDUitQxR5wBNn0tqLjr1kTXnCZ+mmuvQQBN1c6CGyODNF94P5Zd8wnQLrJtC1MaH6EkW6Z2ocKJWGkYJGuYDNSzwhKiR+VUoPHNUTwoJmdOCRH4tiERttECfIaSfWpJ0bemAqPcA6nA0TIccp0R9NLh/5jqmBnHDxxCI+ljhRK3qPtZzot4DZrZiZ0TdSmveOpaoW1mIurUDokakliHqVkDTtyY1F536yJqPEz5NtdShgSbqlkANkcF7vPB+KL8cT5hugXVTiNr4ED3JIr3TRjhRKw3bEDQ8HqjhCZ4QNTK/ThSeOaonJxIypy2J/NoSidpogT5DSD+1I+nazgFRVwPqcBJMh15Of9/lSeD+mat9DeKG2xOIuoNwolZ1d/CcqKvBzJbv7PdddtSad4ol6o4Wou7kgKgRqWWIuiPQ9J1IzUWnPrLmk4VPU+10aKCJuh1QQ2TwdhbeD+WXzoTpFlg3haiND9GTLNI7XYQTtdKwC0HDzkANT/GEqJH5darwzFE9OZWQOaeRyO80IlEbLdBnCOmnriRduzog6m3Av5bxdJgO2YUuifp0cP/MdUYN4obPIBD1mcKJWtV9pudEvQ32d8KWRC3bpRB1N635WbFE3c1C1Gc5IOptwL/TsBvQ9GfV4DQXnfrIms8WPk111aGBJuquQA2RwXuO8H4ov5xDmG6BdVOI2vgQPckivdNdOFErDbsTNDwHqOG5nhA1Mr/OE545qifnETKnB4n8ehCJ2miBPkNIP/Uk6drTAVFvBRL1+TAdigpcEvX54P6Zq1cN4oZ7EYi6SDhRq7qLPCfqrTCizi2wbJdC1MVa85JYoi62EHWJA6LeCiTqYqDpS2pwmotOfWTNpcKnqZ46NNBE3ROoITJ4y4T3Q/mljDDdAuumELXxIXqSRXqnt3CiVhr2JmhYBtTwAk+IGplfFwrPHNWTCwmZ04dEfn2IRG20QJ8hpJ/6knTt64Co/wES9UUwHfKcftf3ReD+meviGsQNX0wg6kuEE7Wq+xLPifofGFEXOfuu735a80tjibqfhagvdUDU/wCJuh/Q9JfW4DQXnfrImi8TPk311aGBJuq+QA2RwXu58H4ov1xOmG6BdVOI2vgQPckivdNfOFErDfsTNLwcqOEVnhA1Mr+uFJ45qidXEjJnAIn8BhCJ2miBPkNIPw0k6TrQAVH/DSTqq3Cf0OS5JOqrwP0z19U1iBu+mkDU1wgnalX3NZ4T9d84oi6ybJdC1IO05tfGEvUgC1Ff64Co/wYS9SCg6a+twWkuOvWRNV8nfJoaqEMDTdQDgRoig3ew8H4ovwwmTLfAuilEbXyInmSR3hkinKiVhkMIGg4Gani9J0SNzK8bhGeO6skNhMwZSiK/oUSiNlqgzxDST8NIug5zQNRbgER9I26ezHdJ1DeC+2eum2oQN3wTgaiHCydqVfdwz4l6C+67vntZtksh6hFa85tjiXqEhahvdkDUW4BEPQJo+ptrcJqLTn1kzbcIn6aG6dBAE/UwoIbI4L1VeD+UX24lTLfAuilEbXyInmSR3hkpnKiVhiMJGt4K1PA2T4gamV+3C88c1ZPbCZlzB4n87iAStdECfYaQfhpF0nWUA6L+C0jUd8J0KHD6t2fdCe6fue6qQdzwXQSivls4Uau67/acqP+CEXXU2d+eNVprfk8sUY+2EPU9Doj6LyBRjwaa/p4anOaiUx9Z873Cp6lROjTQRD0KqCEyeO8T3g/ll/sI0y2wbgpRGx+iJ1mkd8YIJ2ql4RiChvcBNbzfE6JG5tcDwjNH9eQBQuY8SCK/B4lEbbRAnyGkn8aSdB3rgKj/BBL1Q54S9UPg/pnr4RrEDT9MIOpHhBO1qvsRz4n6Tw+JepzWfHwsUY+zEPV4B0T9J5CoxwFNP94TokbW/KjwaWqsDg00UY8FaogM3gnC+6H8MoEw3QLrphC18SF6kkV6Z6JwolYaTiRoOAGo4WOeEDUyvx4XnjmqJ48TMmcSifwmEYnaaIE+Q0g/TSbpOtkBUf8BJOonYDrkOf1d30+A+2euJ2sQN/wkgainCCdqVfcUz4n6DxhR93L2u76nas2fiiXqqRaifsoBUf8BJOqpQNM/VYPTXHTqI2t+Wvg0NVmHBpqoJwM1RAbvNOH9UH6ZRphugXVTiNr4ED3JIr0zXThRKw2nEzScBtTwGU+IGplfzwrPHNWTZwmZ8xyJ/J4jErXRAn2GkH6aQdJ1hgOi3gwk6udxRF3ikqifB/fPXC/UIG74BQJRvyicqFXdL3pO1JtxRJ1j2S6FqGdqzV+KJeqZFqJ+yQFRbwYS9Uyg6V+qwWkuOvWRNb8sfJqaoUMDTdQzgBoig3eW8H4ov8wiTLfAuilEbXyInmSR3pktnKiVhrMJGs4CaviKJ0SNzK9XhWeO6smrhMyZQyK/OUSiNlqgzxDST3NJus51QNSbgET9GkyHbKefUb8G7p+5Xq9B3PDrBKKeJ5yoVd3zPCfqTTCiLnH2GfV8rfkbsUQ930LUbzgg6k1Aop4PNP0bNTjNRac+suY3hU9Tc3VooIl6LlBDZPAuEN4P5ZcFhOkWWDeFqI0P0ZMs0jsLhRO10nAhQcMFQA3f8oSokfn1tvDMUT15m5A575DI7x0iURst0GcI6adFJF0XOSDq34FE/S5Mh5wcl0T9Lrh/5nqvBnHD7xGI+n3hRK3qft9zov4dRtTFJZbtUoh6sdb8g1iiXmwh6g8cEPXvQKJeDDT9BzU4zUWnPrLmD4VPU4t0aKCJehFQQ2TwLhHeD+WXJYTpFlg3haiND9GTLNI7S4UTtdJwKUHDJUANP/KEqJH59bHwzFE9+ZiQOZ+QyO8TIlEbLdBnCOmnZSRdlzkg6t+ARP0pTIdSp59Rfwrun7k+q0Hc8GcEol4unKhV3cs9J+rfYEQdOPuMeoXW/PNYol5hIerPHRD1b0CiXgE0/ec1OM1Fpz6y5i+ET1PLdGigiXoZUENk8K4U3g/ll5WE6RZYN4WojQ/RkyzSO6uEE7XScBVBw5VADb/0hKiR+fWV8MxRPfmKkDlfk8jvayJRGy3QZwjpp9UkXVc7IOqNQKL+BqZDrlOi/gbcP3N9W4O44W8JRP2dcKJWdX/nOVFvhBF1kTOiXqM1/z6WqNdYiPp7B0S9EUjUa4Cm/74Gp7no1EfW/IPwaWq1Dg00Ua8GaogM3rXC+6H8spYw3QLrphC18SF6kkV6Z51wolYariNouBao4Y+eEDUyv34SnjmqJz8RMudnEvn9TCRqowX6DCH9tJ6k63oHRL0BSNS/wHSIFrok6l/A/TPXrzWIG/6VQNQbhBO1qnuD50S9AUbUBVHLdilEvVFr/lssUW+0EPVvDoh6A5CoNwJN/1sNTnPhX0cF1vy78GlqvQ4NNFGvB2qIDN5Nwvuh/LKJMN0C66YQtfEhepJFemezcKJWGm4maLgJqOEfnhA1Mr/+FJ45qid/EjLnLxL5/UUkaqMF+gwh/bSFpOsWB0T9K5Co/8Z9QuOUqP8G989c/9QgbvgfAlFvFU7Uqu6tnhP1rzCiznVG1NuM5jWr7UjP2yxErf4jNlH/CiTqbUjT1+Q0F536yJr3qCl7mtqiQwNN1FuAGiKDN0F4P5Rf1B7R0y2wbgpRGx+iJ1mkdxLJGkbiu/5zltUe0RqW9068GlYHa2gu9DsAmV9JwjNH9SSJkDnJwF6Xn6GSa/KI2miBPkNIP6WQdE2pySfqX4BEnQrTIRpxSdSp4P6ZK60mccNpNfHrpgNfLKy602tuFxi0rlOi/gVG1IURy3YpRJ2hNa8RS9QZNf9N1DUcEPUvQKLOAJq+Rk1Oc9Gpj6y5pvBpKkWHBpqoU4AaIoM3U3g/lF8yCdMtsG4KURsfoidZpHeyhBO10jCLoGEmUMNanhA1Mr9qC88c1ZPahMzZk0R+exKJ2miBPkNIP9Uh6VrHAVGvBxL1Xrh5MnBJ1HuB+2euvWsSN7w3gaj3EU7Uqu59PCfq9TCizi+zbJdC1HW15vvGEnVdC1Hv64Co1wOJui7Q9PvW5DQXnfrImvcTPk3V0aGBJuo6QA2Rwbu/8H4ov+xPmG6BdVOI2vgQPckivVNPOFErDesRNNwfqOEBnhA1Mr8OFJ45qicHEjLnIBL5HUQkaqMF+gwh/VSfpGt9B0T9M5CoG+C+59Hp357VANw/cx1ck7jhgwlE3VA4Uau6G3pO1D/jfjOZs789q5HW/JBYom5kIepDHBD1z0CibgQ0/SE1Oc1Fpz6y5kOFT1P1dWigibo+UENk8B4mvB/KL4cRpltg3RSiNj5ET7JI7zQWTtRKw8YEDQ8Dani4J0SNzK8jhGeO6skRhMw5kkR+RxKJ2miBPkNIPzUh6drEAVH/BCTqpjAdSp1+Rt0U3D9zHVWTuOGjCETdTDhRq7qbeU7UP+H+9ixnn1E315pHYom6uYWoIw6I+icgUTcHmj5Sk9NcdOojaw6ET1NNdGigiboJUENk8GYL74fySzZhugXWTSFq40P0JIv0To5wolYa5hA0zAZqmOsJUSPzK0945qie5BEyJ59EfvlEojZaoM8Q0k9Rkq5RB0T9I5CoC2A6lOW5JOoCcP/MVViTuOFCAlG3EE7Uqu4WnhP1jzCijhRZtksh6pZa86NjibqlhaiPdkDUPwKJuiXQ9EfX5DQXnfrImo8RPk1FdWigiToK1BAZvMcK74fyy7GE6RZYN4WojQ/RkyzSO62EE7XSsBVBw2OBGrb2hKiR+XWc8MxRPTmOkDnHk8jveCJRGy3QZwjppzYkXds4IOp1QKI+AaZDodPv+j4B3D9znViTuOETCUTdVjhRq7rbek7U63A/R+3su77bac1PiiXqdhaiPskBUa8DEnU7oOlPqslpLjr1kTW3Fz5NtdGhgSbqNkANkcHbQXg/lF86EKZbYN0UojY+RE+ySO90FE7USsOOBA07ADXs5AlRI/PrZOGZo3pyMiFzOpPIrzORqI0W6DOE9FMXkq5dHBD1WiBRn4L7jNrp7/o+Bdw/c51ak7jhUwlEfZpwolZ1n+Y5Ua/Ffde3s9/13VVrfnosUXe1EPXpDoh6LZCouwJNf3pNTnPRqY+s+Qzh01QXHRpoou4C1BAZvGcK74fyy5mE6RZYN4WojQ/RkyzSO92EE7XSsBtBwzOBGp7lCVEj8+ts4ZmjenI2IXPOIZHfOUSiNlqgzxDST91JunbXurqkyx8ysLWY69yaxA2fS6DL84TTpar7PAJd2vaKOCDnEQ4x8ODR+y1VQ2TdPTwZJroDa+4pfJhQtfYgDBPnCx++VV/OJ2dOvBr2Ig0Ovf4PBofvSYNDUU3ihosIg0Ox8MFB1V3syeCgjFxMOMTAg0fvt1QNkXWXeDI49ALWXCp8cFC1lhAGhzLhg4PqSxk5c+LVsDdpcOjt4DP8NcDP8C8AniGXw9IFNTnD0oU1iRu+kDAs9RE+LKm6+zgaliLxXUFvvVf0R4e9gT1C9ruv8BeoCrq+hBfoRcJfoKrmiwh1X0x66V1s+RYQtCbsniHOeB/C0IM875cI973S8BKChn2BGvbzBLSQ75xLhb8nVE8uJeTlZaS8vIz4ce/OtIjEdwVIPylQSK22fc4qf6H33bQa57xWg+4zm/q9neW91kD/uX/YzyvC+8rwHhDeA8P7qvC+OryvCe9B4X1teF8X3oPDe0h4Xx/eN4T30PAeFt43hvdN4T08vEeE983hfUt43xreI8P7tvC+PbzvCO9R4X1neN8V3nfXrLbj95D21wNE+WdXWJ5daXk2wPJsoOXZVZZnV1ueXWN5Nsjy7FrLs+sszwZbng2xPLve8uwGy7OhlmfDLM9utDy7yfJsuOXZCMuzmy3PbrE8u9XybKTl2W2WZ7dbnt1heTbK8uxOy7O7LM/utgyrB+t/ttb/jMR37RA68YZlf0Dwmu99vgK0lqrxSsha/9VrQPxrZWu9goHxrpX7P+2Dq+JbK1Kuj8HV8ayVvYMngmuqvlYkxl/BoCqulV/2L68G11ZtrQKL74PrqrJWgfUMBYMrv1Z0J+cxGFLZtaI7PdvB9ZVbK3sXORHcUJm1orvMnGBoxdcq3k1+BcMqulZ0t1kY3FixtSIVyNXgpoqsFalQRgfDd79WXgXzPhixu7VyK/zuCG7e5Vq5ZZV4DwW37GqtaKXeacGtO1+roJLvx2DkTtYqLKv0uza4zb5WpArv7eB221qRKs0AwR3/Xiuo4jwRjIpdq6TKs0lw545r5cQx5wR3lVsruyyumSm425Mv0txdE7fWaFjNOU5/Gnc0sFfl93tPTeKG7yF8heVeoBlYdd9bc7vAoHWd/jQuLhhKnP007n1a8zGxXzW5T5uw/LMxNfk/jYtILUOk9wFNPwbcXMYBv68m/svU93nytrsL2Ov7YTXn57p8291Pets9UJO44QcIb7sHhb/tVN0Pev62uwtmtsJiy3Ypb7uxWvOHYt92Yy1vu4ccvO3uAr7txgJN/xCpuejUR9b8MC49rR9Ex7u/e3VooL+BAYkGj4CnBXRoqR4/QpiSpNdtvIOue5wn0yHS4+PJORGJ7wpUT8YTcuIRoIaPenBeHiWclwngCd3MKhPK7ZWlBdpP44F+mkjSdWJN/k9c3AnU4TGYDrmlLsn1MXD/zPV4TeKGHyeQ6yTh5KrqnuQ5ud4JM1tRtmW7FHKdrDV/IpZcJ1vI9QkH5IpILUOuk4Gmf4LUXHTqI2t+UvhEOlGHBvpHnyYCNUQG7xTh/VB+mUKYboF1U36MxvgQPckivTNVOBkpDacSNJwC1PApT74qgcyvp4VnjurJ04TMmUYiv2lEojZaoM8Q0k/TSbpOd0DUo4A6PAPTIZrtkqifAffPXM/WJG74WQJRPyecqFXdz3lO1KNgZisotWyXQtQztObPxxL1DAtRP++AqBGpZYh6BtD0z5Oai059ZM0vCJ+mpuvQQBP1dKCGyOB9UXg/lF9eJEy3wLopRG18iJ5kkd6ZKZyolYYzCRq+CNTwJU+IGplfLwvPHNWTlwmZM4tEfrOIRG20QJ8hpJ9mk3Sd7YCo7wDq8ApMh1KnvxXwFXD/zPVqTeKGXyUQ9RzhRK3qnuM5Ud8BM1tQZtkuhajnas1fiyXquRaifs0BUSNSyxD1XKDpXyM1F536yJpfFz5NzdahgSbq2UANkcE7T3g/lF/mEaZbYN0UojY+RE+ySO/MF07USsP5BA3nATV8wxOiRubXm8IzR/XkTULmLCCR3wIiURst0GcI6aeFJF0XOiDq24E6vAXTIccpUb8F7p+53q5J3PDbBKJ+RzhRq7rf8Zyob4eZrdgZUS/Smr8bS9SLLET9rgOiRqSWIepFQNO/S2ouOvWRNb8nfJpaqEMDTdQLgRoig/d94f1QfnmfMN0C66YQtfEhepJFemexcKJWGi4maPg+UMMPPCFqZH59KDxzVE8+JGTOEhL5LSEStdECfYaQflpK0nWpA6K+DajDRzAdejn9fZcfgftnro9rEjf8MYGoPxFO1KruTzwn6ttgZst39vsul2nNP40l6mUWov7UAVEjUssQ9TKg6T8lNRed+siaPxM+TS3VoYEm6qVADZHBu1x4P5RflhOmW2DdFKI2PkRPskjvrBBO1ErDFQQNlwM1/NwTokbm1xfCM0f15AtC5qwkkd9KIlEbLdBnCOmnVSRdVzkg6pFAHb6E6ZBd6JKovwT3z1xf1SRu+CsCUX8tnKhV3V97TtQjYWYriVq2SyHq1Vrzb2KJerWFqL9xQNSI1DJEvRpo+m9IzUWnPrLmb4VPU6t0aKCJehVQQ2Twfie8H8ov3xGmW2DdFKI2PkRPskjvrBFO1ErDNQQNvwNq+L0nRI3Mrx+EZ47qyQ+EzFlLIr+1RKI2WqDPENJP60i6rnNA1LcCdfgRpkNRgUui/hHcP3P9VJO44Z8IRP2zcKJWdf/sOVHfCjNbboFluxSiXq81/yWWqNdbiPoXB0SNSC1D1OuBpv+F1Fx06iNr/lX4NLVOhwaaqNcBNUQG7wbh/VB+2UCYboF1U4ja+BA9ySK9s1E4USsNNxI03ADU8DdPiBqZX78LzxzVk98JmbOJRH6biERttECfIaSfNpN03eyAqG8B6vAHTIc8p9/1/Qe4f+b6syZxw38SiPov4USt6v7Lc6K+BfdlJ2ff9b1Fa/53LFFvsRD13w6IGpFahqi3AE3/N6m56NRH1vyP8Glqsw4NNFFvBmqIDN6twvuh/LKVMN0C66YQtfEhepJFemebcKJWGm4jaLgVOfhk+kHUyPzaI1N25qieqD2iz3QCsNflZ6iETB5RGy3QZwjpp0SSromZfKK+GahDdZgOuXkuibo6uH/mSsokbjgpE79ucqZsolZ1J2duFxi0rlOivhkHXUWW7VKIOkVrnppZbUd6Tsn8N1Gr/4hN1DcDiToFaPrUTE5z0amPrDlN+DSVqEMDTdSJQA2RwZsuvB/KL+mE6TYdTDLo/RkfoidZpHcyyBpG4rv+c5YzCBqmAzWs4QlRI/OrpvDMUT2pScicTBL5ZRKJ2miBPkNIP2WRdM1yQNQjgERdCzdP5rsk6lrg/pmrdiZxw7UJRL2ncKJWde/pOVGPwH1jcC/LdilEXUdrvlcsUdexEPVeDoh6BJCo6wBNv1cmp7no1EfWvLfwaSpLhwaaqLOAGiKDdx/h/VB+2Ycw3QLrphC18SF6kkV6p65wolYa1iVouA9Qw309IWpkfu0nPHNUT/YjZM7+JPLbn0jURgv0GUL6qR5J13oOiHo4kKgPgOlQ4PRvzzoA3D9zHZhJ3PCBBKI+SDhRq7oP8pyoh8OIOursb8+qrzVvEEvU9S1E3cABUQ8HEnV9oOkbZHKai059ZM0HC5+m6unQQBN1PaCGyOBtKLwfyi8NCdMtsG4KURsfoidZpHcaCSdqpWEjgoYNgRoe4glRI/PrUOGZo3pyKCFzDiOR32FEojZaoM8Q0k+NSbo2dkDUNwGJ+nBPifpwcP/MdUQmccNHEIj6SOFEreo+0nOivslDom6iNW8aS9RNLETd1AFR3wQk6iZA0zf1hKiRNR8lfJpqrEMDTdSNgRoig7eZ8H4ovzQjTLfAuilEbXyInmSR3mkunKiVhs0JGjYDahjxhKiR+RUIzxzVk4CQOdkk8ssmErXRAn2GkH7KIema44CobwQSdS5Mhzynv+s7F9w/c+VlEjecRyDqfOFErerO95yob4QRdS9nv+s7qjUviCXqqIWoCxwQ9Y1Aoo4CTV+QyWkuOvWRNRcKn6ZydGigiToHqCEyeFsI74fySwvCdAusm0LUxofoSRbpnZbCiVpp2JKgYQughkd7QtTI/DpGeOaonhxDyJxjSeR3LJGojRboM4T0UyuSrq0cEPUwIFG3xhF1iUuibg3un7mOyyRu+DgCUR8vnKhV3cd7TtTDcESdY9kuhajbaM1PiCXqNhaiPsEBUQ8DEnUboOlPyOQ0F536yJpPFD5NtdKhgSbqVkANkcHbVng/lF/aEqZbYN0UojY+RE+ySO+0E07USsN2BA3bAjU8yROiRuZXe+GZo3rSnpA5HUjk14FI1EYL9BlC+qkjSdeODoh6KJCoO8F0yHb6GXUncP/MdXImccMnE4i6s3CiVnV39pyoh8KIusTZZ9RdtOanxBJ1FwtRn+KAqIcCiboL0PSnZHKai059ZM2nCp+mOurQQBN1R6CGyOA9TXg/Tg33dxphugXWTSFq40P0JIv0TlfhRK007ErQ8DSghqd7QtTI/DpDeOaonpxByJwzSeR3JpGojRboM4T0UzeSrt0cEPUNQKI+C6ZDTo5Loj4L3D9znZ1J3PDZBKI+RzhRq7rP8Zyob4ARdXGJZbsUou6uNT83lqi7W4j6XAdEfQOQqLsDTX9uJqe56NRH1nye8Gmqmw4NNFF3A2qIDN4ewvuh/NKDMN0C66YQtfEhepJFeqencKJWGvYkaNgDqOH5nhA1Mr96Cc8c1ZNehMwpIpFfEZGojRboM4T0UzFJ12IHRH09kKhLYDqUOv2MugTcP3OVZhI3XEog6jLhRK3qLvOcqK+HEXXg7DPq3lrzC2KJureFqC9wQNTXA4m6N9D0F2RymotOfWTNFwqfpop1aKCJuhioITJ4+wjvh/JLH8J0C6ybQtTGh+hJFumdvsKJWmnYl6BhH6CGF3lC1Mj8ulh45qieXEzInEtI5HcJkaiNFugzhPRTP5Ku/RwQ9RAgUV8K0yHXKVFfCu6fuS7LJG74MgJRXy6cqFXdl3tO1ENgRF3kjKj7a82viCXq/haivsIBUQ8BEnV/oOmvyOQ0F536yJqvFD5N9dOhgSbqfkANkcE7QHg/lF8GEKZbYN0UojY+RE+ySO8MFE7USsOBBA0HADW8yhOiRubX1cIzR/XkakLmXEMiv2uIRG20QJ8hpJ8GkXQd5ICoBwOJ+lqYDtFCl0R9Lbh/5rouk7jh6whEPVg4Uau6B3tO1INhRF0QtWyXQtRDtObXxxL1EAtRX++AqAcDiXoI0PTXZ3KaC/86KrDmG4RPU4N0aKCJehBQQ2TwDhXeD+WXoYTpFlg3haiND9GTLNI7w4QTtdJwGEHDoUANb/SEqJH5dZPwzFE9uYmQOcNJ5DecSNRGC/QZQvppBEnXEQ6I+jogUd+M+4TGKVHfDO6fuW7JJG74FgJR3yqcqFXdt3pO1NfBiDrXGVGP1JrfFkvUIy1EfZsDor4OSNQjgaa/LZPTXHTqI2u+Xfg0NUKHBpqoRwA1RAbvHcL7ofxyB2G6BdZNIWrjQ/Qki/TOKOFErTQcRdDwDqCGd3pC1Mj8ukt45qie3EXInLtJ5Hc3kaiNFugzhPTTaJKuox0Q9bVAor4H9xl1xCVR3wPun7nuzSRu+F4CUd8nnKhV3fd5TtTXwoi6MGLZLoWox2jN748l6jEWor7fAVFfCyTqMUDT35/JaS469ZE1PyB8mhqtQwNN1KOBGiKD90Hh/VB+eZAw3QLrphC18SF6kkV6Z6xwolYajiVo+CBQw4c8IWpkfj0sPHNUTx4mZM4jJPJ7hEjURgv0GUL6aRxJ13EOiHoQkKjH4+bJwCVRjwf3z1yPZhI3/CiBqCcIJ2pV9wTPiXoQjKjzyyzbpRD1RK35Y7FEPdFC1I85IOpBQKKeCDT9Y5mc5qJTH1nz48KnqXE6NNBEPQ6oITJ4Jwnvh/LLJMJ0C6ybQtTGh+hJFumdycKJWmk4maDhJKCGT3hC1Mj8elJ45qiePEnInCkk8ptCJGqjBfoMIf00laTrVAdEfQ2QqJ/Cfc+j07896ylw/8z1dCZxw08TiHqacKJWdU/znKivwf1mMmd/e9Z0rfkzsUQ93ULUzzgg6muARD0daPpnMjnNRac+suZnhU9TU3VooIl6KlBDZPA+J7wfyi/PEaZbYN0UojY+RE+ySO/MEE7USsMZBA2fA2r4vCdEjcyvF4RnjurJC4TMeZFEfi8SidpogT5DSD/NJOk60wFRXw0k6pdgOpQ6/Yz6JXD/zPVyJnHDLxOIepZwolZ1z/KcqK/G/e1Zzj6jnq01fyWWqGdbiPoVB0R9NZCoZwNN/0omp7no1EfW/KrwaWqmDg00Uc8EaogM3jnC+6H8Mocw3QLrphC18SF6kkV6Z65wolYaziVoOAeo4WueEDUyv14XnjmqJ68TMmceifzmEYnaaIE+Q0g/zSfpOt8BUV8FJOo3YDqU5bkk6jfA/TPXm5nEDb9JIOoFwola1b3Ac6K+CkbUkSLLdilEvVBr/lYsUS+0EPVbDoj6KiBRLwSa/q1MTnPRqY+s+W3h09R8HRpoop4P1BAZvO8I74fyyzuE6RZYN4WojQ/RkyzSO4uEE7XScBFBw3eAGr7rCVEj8+s94ZmjevIeIXPeJ5Hf+0SiNlqgzxDST4tJui52QNQDgUT9AUyHQqff9f0BuH/m+jCTuOEPCUS9RDhRq7qXeE7UA3E/R+3su76Xas0/iiXqpRai/sgBUQ8EEvVSoOk/yuQ0F536yJo/Fj5NLdahgSbqxUANkcH7ifB+KL98QphugXVTiNr4ED3JIr2zTDhRKw2XETT8BKjhp54QNTK/PhOeOaonnxEyZzmJ/JYTidpogT5DSD+tIOm6wgFRDwAS9ee4z6id/q7vz8H9M9cXmcQNf0Eg6pXCiVrVvdJzoh6A+65vZ7/re5XW/MtYol5lIeovHRD1ACBRrwKa/stMTnPRqY+s+Svh09QKHRpool4B1BAZvF8L74fyy9eE6RZYN4WojQ/RkyzSO6uFE7XScDVBw6+BGn7jCVEj8+tb4ZmjevItIXO+I5Hfd0SiNlqgzxDST2tIuq7RurqkyytrYmsx1/eZxA1/T6DLH4TTpar7BwJd2vaKOCA/EA4x8ODR+y1VQ2Tdaz0ZJtYAa14nfJhQta4lDBM/Ch++VV9+JGdOvBr+RBocfvo/GByuIA0OP2cSN/wzYXBYL3xwUHWv92RwUEZeTzjEwINH77dUDZF1/+LJ4PATsOZfhQ8OqtZfCIPDBuGDg+rLBnLmxKvhRtLgsNHBZ/j9gZ/h/wY8Qy6Hpd8yOcPS75nEDf9OGJY2CR+WVN2bHA1LkfiuYKPeK/qjw43AHiH7vVn4C1QF3WbCC/QP4S9QVfMfhLr/JL30/rR8CwhaE3bPEGd8E2HoQZ73v4T7Xmn4F0HDzUANt3gCWsh3zt/C3xOqJ38T8vIfUl7+Q/y4d2daROK7AqSfFCikVts+Z5W/0PtuVo1zXqtB95lN/d7O8l5roP+8Tc3kWeGz8E4I78Twrh7eSeGdHN4p4Z0a3mnhnR7eGeFdI7xrhndmeGeFd63wrh3ee4Z3nfDeK7z3Du99wrtueO8b3vuF9/7hXS+8DwjvA8P7oKxqO34P6TY9QJR/pjYX+2wPy7MEy7NEy7PqlmdJlmfJlmcplmeplmdplmfplmcZlmc1LM9qWp5lWp5lWZ7VsjyrbXm2p+VZHcuzvSzP9rY828fyrK7l2b6WZ/tZnu1veVbP8uwAy7MDLc8Oyvr3sHqw/mdr/c9IfNcOoRNvWG4DBK/53md1phBrqRr3gKz1X70S4l8rW+sVJMa7Vu7/tA+qx7dWpFwfg6R41srewRNBctXXisT4K0ip4lr5Zf/yapBatbUKLL4P0qqyVoH1DAXplV8rupPzGGRUdq3oTs92UKNya2XvIieCmpVZK7rLzAkyK75W8W7yK8iq6FrR3WZhUKtia0UqkKtB7YqsFalQRgd77n6tvArmfVBnd2vlVvjdEey1y7VyyyrxHgr23tVa0Uq904J9dr5WQSXfj0HdnaxVWFbpd22wr32tSBXe28F+trUiVZoBgv3/vVZQxXkiqBe7VkmVZ5PggB3XyoljzgkOLLdWdllcM1NwUJYfX6Q5KAu3Vn1YzTlOfxq3PrBX5ffbIIu4YbU4et2DgWZg1X1w1naBQes6/WlcXDCUOPtp3IZa80axXzVpqE1Y/lmjLP5P4yJSyxBpQ6DpG4GbyzjgDbPwX6Zu6Mnb7kBgrw+B1Zyf6/JtdwjpbXdoFnHDhxLedocJf9upug/z/G13IMxshcWW7VLedo215ofHvu0aW952hzt42x0IfNs1Bpr+cFJz0amPrPkIXHpaP4iOd38H69BAfwMDEg2OBE8L6NBSPT6SMCVJr9t4B113E0+mQ6THm5JzIhLfFaieNCXkxJFADY/y4LwcRTgvzcATuplVmpXbK0sLtJ+aAv3UnKRr8yz+T1wcANQhAtMht9QluUbA/TNXkEXccEAg12zh5KrqzvacXA+Ama0o27JdCrnmaM1zY8k1x0KuuQ7IFZFahlxzgKbPJTUXnfrImvOET6TNdWigf/SpOVBDZPDmC++H8ks+YboF1k35MRrjQ/Qki/ROVDgZKQ2jBA3zgRoWePJVCWR+FQrPHNWTQkLmtCCRXwsiURst0GcI6aeWJF1bOiDqekAdjobpEM12SdRHg/tnrmOyiBs+hkDUxwonalX3sZ4TdT2Y2QpKLdulEHUrrXnrWKJuZSHq1g6IGpFahqhbAU3fmtRcdOojaz5O+DTVUocGmqhbAjVEBu/xwvuh/HI8YboF1k0hauND9CSL9E4b4UStNGxD0PB4oIYneELUyPw6UXjmqJ6cSMictiTya0skaqMF+gwh/dSOpGs7B0S9P1CHk2A6lDr9rYAngftnrvZZxA23JxB1B+FEreru4DlR7w8zW1Bm2S6FqDtqzTvFEnVHC1F3ckDUiNQyRN0RaPpOpOaiUx9Z88nCp6l2OjTQRN0OqCEyeDsL74fyS2fCdAusm0LUxofoSRbpnS7CiVpp2IWgYWeghqd4QtTI/DpVeOaonpxKyJzTSOR3GpGojRboM4T0U1eSrl0dEPV+QB1Oh+mQ45SoTwf3z1xnZBE3fAaBqM8UTtSq7jM9J+r9YGYrdkbU3bTmZ8USdTcLUZ/lgKgRqWWIuhvQ9GeRmotOfWTNZwufprrq0EATdVeghsjgPUd4P5RfziFMt8C6KURtfIieZJHe6S6cqJWG3QkangPU8FxPiBqZX+cJzxzVk/MImdODRH49iERttECfIaSfepJ07emAqPcF6nA+TIdeTn/f5fng/pmrVxZxw70IRF0knKhV3UWeE/W+MLPlO/t9l8Va85JYoi62EHWJA6JGpJYh6mKg6UtIzUWnPrLmUuHTVE8dGmii7gnUEBm8ZcL7ofxSRphugXVTiNr4ED3JIr3TWzhRKw17EzQsA2p4gSdEjcyvC4VnjurJhYTM6UMivz5EojZaoM8Q0k99Sbr2dUDUdYE6XATTIbvQJVFfBO6fuS7OIm74YgJRXyKcqFXdl3hO1HVhZiuJWrZLIep+WvNLY4m6n4WoL3VA1IjUMkTdD2j6S0nNRac+subLhE9TfXVooIm6L1BDZPBeLrwfyi+XE6ZbYN0UojY+RE+ySO/0F07USsP+BA0vB2p4hSdEjcyvK4VnjurJlYTMGUAivwFEojZaoM8Q0k8DSboOdEDU+wB1uAqmQ1GBS6K+Ctw/c12dRdzw1QSivkY4Uau6r/GcqPeBmS23wLJdClEP0ppfG0vUgyxEfa0DokakliHqQUDTX0tqLjr1kTVfJ3yaGqhDA03UA4EaIoN3sPB+KL8MJky3wLopRG18iJ5kkd4ZIpyolYZDCBoOBmp4vSdEjcyvG4RnjurJDYTMGUoiv6FEojZaoM8Q0k/DSLoOc0DUewN1uBGmQ57T7/q+Edw/c92URdzwTQSiHi6cqFXdwz0n6r1xX3Zy9l3fI7TmN8cS9QgLUd/sgKgRqWWIegTQ9DeTmotOfWTNtwifpobp0EAT9TCghsjgvVV4P5RfbiVMt8C6KURtfIieZJHeGSmcqJWGIwka3grU8DZPiBqZX7cLzxzVk9sJmXMHifzuIBK10QJ9hpB+GkXSdZQDot4LqMOduE9o8lwS9Z3g/pnrrizihu8iEPXdwola1X2350S9Fw66iizbpRD1aK35PbFEPdpC1Pc4IGpEahmiHg00/T2k5qJTH1nzvcKnqVE6NNBEPQqoITJ47xPeD+WX+wjTLbBuClEbH6InWaR3xggnaqXhGIKG9wE1vN8Tokbm1wPCM0f15AFC5jxIIr8HiURttECfIaSfxpJ0HeuAqOsAdXgIN0/muyTqh8D9M9fDWcQNP0wg6keEE7Wq+xHPiboO7stOvSzbpRD1OK35+FiiHmch6vEOiBqRWoaoxwFNP57UXHTqI2t+VPg0NVaHBpqoxwI1RAbvBOH9UH6ZQJhugXVTiNr4ED3JIr0zUThRKw0nEjScANTwMU+IGplfjwvPHNWTxwmZM4lEfpOIRG20QJ8hpJ8mk3Sd7ICo9wTq8ARMhwKnf3vWE+D+mevJLOKGnyQQ9RThRK3qnuI5Ue8JM1vU2d+eNVVr/lQsUU+1EPVTDogakVqGqKcCTf8Uqbno1EfW/LTwaWqyDg00UU8GaogM3mnC+6H8Mo0w3QLrphC18SF6kkV6Z7pwolYaTidoOA2o4TOeEDUyv54VnjmqJ88SMuc5Evk9RyRqowX6DCH9NIOk6wwHRF0bqMPznhL18+D+meuFLOKGXyAQ9YvCiVrV/aLnRF3bQ6KeqTV/KZaoZ1qI+iUHRI1ILUPUM4Gmf8kTokbW/LLwaWqGDg00Uc8AaogM3lnC+6H8Mosw3QLrphC18SF6kkV6Z7ZwolYaziZoOAuo4SueEDUyv14VnjmqJ68SMmcOifzmEInaaIE+Q0g/zSXpOtcBUdcC6vAaTIc8p7/r+zVw/8z1ehZxw68TiHqecKJWdc/znKhrwczWy9nv+p6vNX8jlqjnW4j6DQdEjUgtQ9TzgaZ/g9RcdOoja35T+DQ1V4cGmqjnAjVEBu8C4f1QfllAmG6BdVOI2vgQPckivbNQOFErDRcSNFwA1PAtT4gamV9vC88c1ZO3CZnzDon83iEStdECfYaQflpE0nWRA6LOAurwLo6oS1wS9bvg/pnrvSziht8jEPX7wola1f2+50SdhYOuHMt2KUS9WGv+QSxRL7YQ9QcOiBqRWoaoFwNN/wGpuejUR9b8ofBpapEODTRRLwJqiAzeJcL7ofyyhDDdAuumELXxIXqSRXpnqXCiVhouJWi4BKjhR54QNTK/PhaeOaonHxMy5xMS+X1CJGqjBfoMIf20jKTrMgdEnQnU4VOYDtlOP6P+FNw/c32WRdzwZwSiXi6cqFXdyz0n6kyY2UqcfUa9Qmv+eSxRr7AQ9ecOiBqRWoaoVwBN/zmpuejUR9b8hfBpapkODTRRLwNqiAzelcL7ofyykjDdAuumELXxIXqSRXpnlXCiVhquImi4Eqjhl54QNTK/vhKeOaonXxEy52sS+X1NJGqjBfoMIf20mqTragdEXROowzcwHXJyXBL1N+D+mevbLOKGvyUQ9XfCiVrV/Z3nRF0TZrbiEst2KUS9Rmv+fSxRr7EQ9fcOiBqRWoao1wBN/z2puejUR9b8g/BparUODTRRrwZqiAzetcL7ofyyljDdAuumELXxIXqSRXpnnXCiVhquI2i4Fqjhj54QNTK/fhKeOaonPxEy52cS+f1MJGqjBfoMIf20nqTregdEXQOowy8wHUqdfkb9C7h/5vo1i7jhXwlEvUE4Uau6N3hO1DVgZgucfUa9UWv+WyxRb7QQ9W8OiBqRWoaoNwJN/xupuejUR9b8u/Bpar0ODTRRrwdqiAzeTcL7ofyyiTDdAuumELXxIXqSRXpns3CiVhpuJmi4CajhH54QNTK//hSeOaonfxIy5y8S+f1FJGqjBfoMIf20haTrFgdEnQHU4W+YDrlOifpvcP/M9U8WccP/EIh6q3CiVnVv9ZyoM2BmK3JG1NuM5rWq7UjP2yxErf4jNlEjUssQ9Tak6WtxmotOfWTNe9SSPU1t0aGBJuotQA2RwZsgvB/KL2qP6OkWWDeFqI0P0ZMs0juJZA0j8V3/Octqj2gNy3snXg2rgzU0F/odgMyvJOGZo3qSRMicZGCvy89QybV4RG20QJ8hpJ9SSLqm1OITdTpQh1SYDtFCl0SdCu6fudJqETecVgu/bjrwxcKqO73WdoFB6zol6nQYURdELdulEHWG1rxGLFFn1Po3UddwQNTpQKLOAJq+Ri1Oc+FfRwXWXFP4NJWiQwNN1ClADZHBmym8H8ovmYTpFlg3haiND9GTLNI7WcKJWmmYRdAwE6hhLU+IGplftYVnjupJbULm7Ekivz2JRG20QJ8hpJ/qkHSt44Co04BEvRfuExqnRL0XuH/m2rsWccN7E4h6H+FErerex3OiTsN9I4czoq6rNd83lqjrWoh6XwdEnQYk6rpA0+9bi9NcdOoja95P+DRVR4cGmqjrADVEBu/+wvuh/LI/YboF1k0hauND9CSL9E494UStNKxH0HB/oIYHeELUyPw6UHjmqJ4cSMicg0jkdxCRqI0W6DOE9FN9kq71HRB1KpCoG+A+o464JOoG4P6Z6+BaxA0fTCDqhsKJWtXd0HOiToURdWHEsl0KUTfSmh8SS9SNLER9iAOiTgUSdSOg6Q+pxWkuOvWRNR8qfJqqr0MDTdT1gRoig/cw4f1QfjmMMN0C66YQtfEhepJFeqexcKJWGjYmaHgYUMPDPSFqZH4dITxzVE+OIGTOkSTyO5JI1EYL9BlC+qkJSdcmDog6BUjUTXHzZOCSqJuC+2euo2oRN3wUgaibCSdqVXczz4k6BUbU+WWW7VKIurnWPBJL1M0tRB1xQNQpQKJuDjR9pBanuejUR9YcCJ+mmujQQBN1E6CGyODNFt4P5ZdswnQLrJtC1MaH6EkW6Z0c4UStNMwhaJgN1DDXE6JG5lee8MxRPckjZE4+ifzyiURttECfIaSfoiRdow6IOhlI1AUwHXKd/u1ZBeD+mauwFnHDhQSibiGcqFXdLTwn6mTcbyZz9rdntdSaHx1L1C0tRH20A6JOBhJ1S6Dpj67FaS469ZE1HyN8morq0EATdRSoITJ4jxXeD+WXYwnTLbBuClEbH6InWaR3WgknaqVhK4KGxwI1bO0JUSPz6zjhmaN6chwhc44nkd/xRKI2WqDPENJPbUi6tnFA1ElAoj4BpkOp08+oTwD3z1wn1iJu+EQCUbcVTtSq7raeE3US7i9YcvYZdTut+UmxRN3OQtQnOSDqJCBRtwOa/qRanOaiUx9Zc3vh01QbHRpoom4D1BAZvB2E90P5pQNhugXWTSFq40P0JIv0TkfhRK007EjQsANQw06eEDUyv04WnjmqJycTMqczifw6E4naaIE+Q0g/dSHp2sUBUVcHEvUpMB3K8lwS9Sng/pnr1FrEDZ9KIOrThBO1qvs0z4m6Ou6vaiuybJdC1F215qfHEnVXC1Gf7oCoqwOJuivQ9KfX4jQXnfrIms8QPk110aGBJuouQA2RwXum8H4ov5xJmG6BdVOI2vgQPckivdNNOFErDbsRNDwTqOFZnhA1Mr/OFp45qidnEzLnHBL5nUMkaqMF+gwh/dSdpGt3B0SdCCTqc2E6FDr9ru9zwf0z13m1iBs+j0DUPYQTtaq7h+dEnYj7OWpn3/XdU2t+fixR97QQ9fkOiDoRSNQ9gaY/vxanuejUR9bcS/g01V2HBpqouwM1RAZvkfB+KL8UEaZbYN0UojY+RE+ySO8UCydqpWExQcMioIYlnhA1Mr9KhWeO6kkpIXPKSORXRiRqowX6DCH91Juka28HRJ0AJOoLcJ9RO/1d3xeA+2euC2sRN3whgaj7CCdqVXcfz4k6Afdd3xHLdilE3VdrflEsUfe1EPVFDog6AUjUfYGmv6gWp7no1EfWfLHwaaq3Dg00UfcGaogM3kuE90P55RLCdAusm0LUxofoSRbpnX7CiVpp2I+g4SVADS/1hKiR+XWZ8MxRPbmMkDmXk8jvciJRGy3QZwjpp/4kXftrXV3S5R5Z2FrMdUUt4oavINDllcLpUtV9JYEubXtFHJArCYcYePDo/ZaqIbLuAZ4ME/2BNQ8UPkyoWgcQhomrhA/fqi9XkTMnXg2vJg0OV/8fDA7VSIPDNbWIG76GMDgMEj44qLoHeTI4KCMPIhxi4MGj91uqhsi6r/VkcLgaWPN1wgcHVeu1hMFhsPDBQfVlMDlz4tVwCGlwGFKL/xn+tkzcWtcDz5DLYen6Wpxh6YZaxA3fQBiWhgofllTdQx0NS5H4rmCI3iv6o8MhwB4h+z1M+AtUBd0wwgv0RuEvUFXzjYS6byK99G6yfAsIWhN2zxBnfChh6EGe9+HCfa80HE7QcBhQwxGegBbynXOz8PeE6snNhLy8hZSXtxA/7t2ZFpH4rgDpJwUKqdW2z1nlL/S+m1fjnNdq0H1m89YOtgOO+mcD/eeRYT9vC+/bw/uO8B4V3neG913hfXd4jw7ve8L73vC+L7zHhPf94f1AeD8Y3mPD+6Hwfji8HwnvceE9PrwfDe8J4T0xvB8L78fDe1J4Tw7vJ8L7yfCeUqvajt9DOlIPEOWf3WZ5drvl2R2WZ6Msz+60PLvL8uxuy7PRlmf3WJ7da3l2n+XZGMuz+y3PHrA8e9DybKzl2UOWZw9bnj1ieTbO8my85dmjlmcTLM8mWp49Znn2uOXZJMuzyZZnT1iePWl5NsUyrB6s/9la/zMS37VD6MQbliMBwWu+9/k20Fqqxtsha/1XrzviXytb6xWMinet3P9pH9wZ31qRcn0M7opnrewdPBHcXfW1IjH+CkZXca38sn95NbinamsVWHwf3FuVtQqsZyi4r/JrRXdyHoMxlV0rutOzHdxfubWyd5ETwQOVWSu6y8wJHqz4WsW7ya9gbEXXiu42C4OHKrZWpAK5GjxckbUiFcro4JHdr5VXwbwPxu1urdwKvzuC8btcK7esEu+h4NFdrRWt1DstmLDztQoq+X4MJu5krcKySr9rg8fsa0Wq8N4OHretFanSDBBM+vdaQRXniWBy7FolVZ5Ngid2XCsnjjkneLLcWtllcc1MwRRPvkgzpRZuramwmnOc/jTuVGCvyu/3qVrEDT9F+ArL00AzsOp+utZ2gUHrOv1pXFwwlEQs24V9xaa8FtO05tNjv2oyTZuw/LPptfg/jYtILUOk04Cmnw5uLuOAT6uF/zL1NE/edk8Ce/0MrOb8XJdvu2dIb7tnaxE3/Czhbfec8Ledqvs5z992T8LMVlhs2S7lbTdDa/587NtuhuVt97yDt92TwLfdDKDpnyc1F536yJpfwKWn9YPoePf3tA4N9DcwINHgRfC0gA4t1eMXCVOS9LqNd9B1z/RkOkR6/CVyTkTiuwLVk5cIOfEiUMOXPTgvLxPOyyzwhG5mlVnl9srSAu2nl4B+mk3SdXYt/k9cPAHU4RWYDrmlLsn1FXD/zPVqLeKGXyWQ6xzh5KrqnuM5uT4BM1tRtmW7FHKdqzV/LZZc51rI9TUH5IpILUOuc4Gmf43UXHTqI2t+XfhEOluHBvpHn2YDNUQG7zzh/VB+mUeYboF1W19eCL/MIUyySO/MF05GSsP5BA3nATV8w5OvSiDz603hmaN68iYhcxaQyG8BkaiNFugzhPTTQpKuCx0Q9WSgDm/BdIhmuyTqt8D9M9fbtYgbfptA1O8IJ2pV9zueE/VkmNkKSi3bpRD1Iq35u7FEvchC1O86IGpEahmiXgQ0/buk5qJTH1nze8KnqYU6NNBEvRCoITJ43xfeD+WX9wnTLbBuClEbH6InWaR3FgsnaqXhYoKG7wM1/MATokbm14fCM0f15ENC5iwhkd8SIlEbLdBnCOmnpSRdlzog6klAHT6C6VDq9LcCfgTun7k+rkXc8McEov5EOFGruj/xnKgnwcwWlFm2SyHqZVrzT2OJepmFqD91QNSI1DJEvQxo+k9JzUWnPrLmz4RPU0t1aKCJeilQQ2TwLhfeD+WX5YTpFlg3haiND9GTLNI7K4QTtdJwBUHD5UANP/eEqJH59YXwzFE9+YKQOStJ5LeSSNRGC/QZQvppFUnXVQ6I+nGgDl/CdMhxStRfgvtnrq9qETf8FYGovxZO1Krurz0n6sdhZit2RtSrtebfxBL1agtRf+OAqBGpZYh6NdD035Cai059ZM3fCp+mVunQQBP1KqCGyOD9Tng/lF++I0y3wLopRG18iJ5kkd5ZI5yolYZrCBp+B9Twe0+IGplfPwjPHNWTHwiZs5ZEfmuJRG20QJ8hpJ/WkXRd54CoHwPq8CNMh15Of9/lj+D+meunWsQN/0Qg6p+FE7Wq+2fPifoxmNnyI5btUoh6vdb8l1iiXm8h6l8cEDUitQxRrwea/hdSc9Gpj6z5V+HT1DodGmiiXgfUEBm8G4T3Q/llA2G6BdZNIWrjQ/Qki/TORuFErTTcSNBwA1DD3zwhamR+/S48c1RPfidkziYS+W0iErXRAn2GkH7aTNJ1swOingjU4Q+YDtmFLon6D3D/zPVnLeKG/yQQ9V/CiVrV/ZfnRD0RZraSqGW7FKLeojX/O5aot1iI+m8HRI1ILUPUW4Cm/5vUXHTqI2v+R/g0tVmHBpqoNwM1RAbvVuH9UH7ZSphugXVTiNr4ED3JIr2zTThRKw23ETTcihx8avtB1Mj82qO27MxRPVF7RJ/pBGCvy89QCbV5RG20QJ8hpJ8SSbom1uYT9QSgDtVhOhQVuCTq6uD+mSupNnHDSbXx6ybXlk3Uqu7k2tsFBq3rlKgnwIaW3ALLdilEnaI1T61dbUd6Tqn9b6JW/xGbqCcAiToFaPrU2pzmolMfWXOa8GkqUYcGmqgTgRoigzddeD+UX9IJ0y2wbgpRGx+iJ1mkdzLIGkbiu/5zljMIGqYDNazhCVEj86um8MxRPalJyJxMEvllEonaaIE+Q0g/ZZF0zXJA1I8CiboWTIc8p9/1XQvcP3PVrk3ccG0CUe8pnKhV3Xt6TtSPwoi6KGLZLoWo62jN94ol6joWot7LAVE/CiTqOkDT71Wb01x06iNr3lv4NJWlQwNN1FlADZHBu4/wfii/7EOYboF1U4ja+BA9ySK9U1c4USsN6xI03Aeo4b6eEDUyv/YTnjmqJ/sRMmd/EvntTyRqowX6DCH9VI+kaz0HRD0eSNQH4D6hyXNJ1AeA+2euA2sTN3wggagPEk7Uqu6DPCfq8TiiLrJsl0LU9bXmDWKJur6FqBs4IOrxQKKuDzR9g9qc5qJTH1nzwcKnqXo6NNBEXQ+oITJ4Gwrvh/JLQ8J0C6ybQtTGh+hJFumdRsKJWmnYiKBhQ6CGh3hC1Mj8OlR45qieHErInMNI5HcYkaiNFugzhPRTY5KujR0Q9TggUR+OmyfzXRL14eD+meuI2sQNH0Eg6iOFE7Wq+0jPiXoc7ru+e1m2SyHqJlrzprFE3cRC1E0dEPU4IFE3AZq+aW1Oc9Gpj6z5KOHTVGMdGmiibgzUEBm8zYT3Q/mlGWG6BdZNIWrjQ/Qki/ROc+FErTRsTtCwGVDDiCdEjcyvQHjmqJ4EhMzJJpFfNpGojRboM4T0Uw5J1xwHRP0IkKhzYToUOP3bs3LB/TNXXm3ihvMIRJ0vnKhV3fmeE/UjMKKOOvvbs6Ja84JYoo5aiLrAAVE/AiTqKND0BbU5zUWnPrLmQuHTVI4ODTRR5wA1RAZvC+H9UH5pQZhugXVTiNr4ED3JIr3TUjhRKw1bEjRsAdTwaE+IGplfxwjPHNWTYwiZcyyJ/I4lErXRAn2GkH5qRdK1lQOifhhI1K09JerW4P6Z67jaxA0fRyDq44UTtar7eM+J+mEPibqN1vyEWKJuYyHqExwQ9cNAom4DNP0JnhA1suYThU9TrXRooIm6FVBDZPC2Fd4P5Ze2hOkWWDeFqI0P0ZMs0jvthBO10rAdQcO2QA1P8oSokfnVXnjmqJ60J2ROBxL5dSAStdECfYaQfupI0rWjA6J+CEjUnWA65Dn9Xd+dwP0z18m1iRs+mUDUnYUTtaq7s+dE/RCMqHs5+13fXbTmp8QSdRcLUZ/igKgfAhJ1F6DpT6nNaS469ZE1nyp8muqoQwNN1B2BGiKD9/+x9x5gUhTd9/+SkQy7S46iopKmdzbMknMOKioqcXfZRUVFJYOKiopKBhUVlZxzzllBRSVjQEVFJYOKOfHv+r7Tr+Pa1Ktybv3q/J/t56mHse92+alTt2/V2ZmdvsHy+VD5coPA7hY4bhFH7eUheieLzJ0OljtqpWEHAQ1vAGp4I4mjRtavmyyvOWpObhKoOTcLOb+bBR21pwX6HkLmU0chXTsacNSTgI76Fpyj7mHSUd8Cnj/vuLWoIPCtAo76NssdtRr3beSOehLOUQd9cEUcdaew5p0zO+pOPo66swFHPQnoqDsBk75zUZnJRVd95Ji7WL6b6hguGmhH3RGoIbLwdrV8PlS+dBXY3QLHLeKovTxE72SRudPNcketNOwmoGFXoIbdSRw1sn6lWF5z1JykCNScVCHnlyroqD0t0PcQMp/ShHRNM+CoXwQ66h4wHeKMvkfdAzx/3pFeVBA4XcBRZ1juqNW4M8gd9YswR93D2HvUPcOa357ZUff0cdS3G3DULwIddU9g0t9eVGZy0VUfOeY7LN9NpYWLBtpRpwE1RBbeOy2fD5UvdwrsboHjFnHUXh6id7LI3OlluaNWGvYS0PBOoIZ3kThqZP262/Kao+bkboGac4+Q87tH0FF7WqDvIWQ+9RbStbcBR/0C0FHfC9MhGDTpqO8Fz5933FdUEPg+AUd9v+WOWo37fnJH/QLMUaf18MEVcdR9wpr3zeyo+/g46r4GHPULQEfdB5j0fYvKTC666iPH3M/y3VTvcNFAO+reQA2Rhbe/5fOh8qW/wO4WOG4RR+3lIXoni8ydAZY7aqXhAAEN+wM1HEjiqJH1a5DlNUfNySCBmjNYyPkNFnTUnhboewiZT0OEdB1iwFE/D3TUD8B0SDf6HvUD4PnzjgeLCgI/KOCoH7LcUatxP0TuqJ+HOWrH2HvUQ8OaP5zZUQ/1cdQPG3DUzwMd9VBg0j9cVGZy0VUfOeZHLN9NDQkXDbSjHgLUEFl4H7V8PlS+PCqwuwWOW8RRe3mI3skic2eY5Y5aaThMQMNHgRo+RuKokfXrcctrjpqTxwVqzhNCzu8JQUftaYG+h5D5NFxI1+EGHPVEoKN+EqZDvFFH/SR4/rzjqaKCwE8JOOqnLXfUatxPkzvqiTBHnWrMUY8Iaz4ys6Me4eOoRxpw1BOBjnoEMOlHFpWZXHTVR455lOW7qeHhooF21MOBGiIL72jL50Ply2iB3S1w3CKO2stD9E4WmTtjLHfUSsMxAhqOBmo4lsRRI+vXOMtrjpqTcQI1Z7yQ8xsv6Kg9LdD3EDKfJgjpOsGAo34O6KifgemQlGzSUT8Dnj/veLaoIPCzAo76OcsdtRr3c+SO+jmYow4l+eCKOOqJYc2fz+yoJ/o46ucNOOrngI56IjDpny8qM7nw36MCx/yC5bupCeGigXbUE4AaIgvvi5bPh8qXFwV2t8BxizhqLw/RO1lk7kyy3FErDScJaPgiUMOXSBw1sn69bHnNUXPyskDNeUXI+b0i6Kg9LdD3EDKfJgvpOtmAo34W6Kin4N6hMeqop4DnzzumFhUEnirgqKdZ7qjVuKeRO+pnYY463pijnh7WfEZmRz3dx1HPMOConwU66unApJ9RVGZy0VUfOeaZlu+mJoeLBtpRTwZqiCy8syyfD5UvswR2t8BxizhqLw/RO1lk7sy23FErDWcLaDgLqOEcEkeNrF9zLa85ak7mCtSceULOb56go/a0QN9DyHyaL6TrfAOO+hmgo16Ae486YNJRLwDPn3csLCoIvFDAUS+y3FGrcS8id9TPwBx1csAHV8RRLw5rviSzo17s46iXGHDUzwAd9WJg0i8pKjO56KqPHPNSy3dT88NFA+2o5wM1RBbeZZbPh8qXZQK7W+C4RRy1l4fonSwyd5Zb7qiVhssFNFwG1HAFiaNG1q+VltccNScrBWrOKiHnt0rQUXtaoO8hZD6tFtJ1tQFHPQHoqNfg9pOOSUe9Bjx/3rG2qCDwWgFHvc5yR63GvY7cUU+AOerEDB9cEUe9Pqz5hsyOer2Po95gwFFPADrq9cCk31BUZnLRVR855o2W76ZWh4sG2lGvBmqILLybLJ8PlS+bBHa3wHGLOGovD9E7WWTubLbcUSsNNwtouAmo4RYSR42sX1strzlqTrYK1JxtQs5vm6Cj9rRA30PIfNoupOt2A456PNBRv4r7zKPRp2e9Cp4/73itqCDwawKOeofljlqNewe5ox6P+2YyY0/P2hnW/PXMjnqnj6N+3YCjHg901DuBSf96UZnJRVd95JjfsHw3tT1cNNCOejtQQ2ThfdPy+VD58qbA7hY4bhFH7eUheieLzJ1dljtqpeEuAQ3fBGr4FomjRtavty2vOWpO3haoOe8IOb93BB21pwX6HkLm024hXXcbcNTjgI56D0yHdKPvUe8Bz5937C0qCLxXwFHvs9xRq3HvI3fU43BPzzL2HvX+sOYHMjvq/T6O+oABRz0O6Kj3A5P+QFGZyUVXfeSYD1q+m9odLhpoR70bqCGy8B6yfD5UvhwS2N0Cxy3iqL08RO9kkbnzruWOWmn4roCGh4AavkfiqJH1633La46ak/cFas4HQs7vA0FH7WmBvoeQ+XRYSNfDBhz1WKCj/hCmQ0aCSUf9IXj+vOOjooLAHwk46o8td9Rq3B+TO+qxMEcdSPXBFXHUR8Kaf5LZUR/xcdSfGHDUY4GO+ggw6T8pKjO56KqPHPOnlu+mDoeLBtpRHwZqiCy8n1k+HypfPhPY3QLHLeKovTxE72SRuXPUcketNDwqoOFnQA0/J3HUyPr1heU1R83JFwI150sh5/eloKP2tEDfQ8h8Oiak6zEDjnoM0FEfh+mQbPRT38fB8+cdJ4oKAp8QcNQnLXfUatwnyR31GNzfURv71PepsOanMzvqUz6O+rQBRz0G6KhPAZP+dFGZyUVXfeSYz1i+mzoWLhpoR30MqCGy8J61fD5UvpwV2N0Cxy3iqL08RO9kkblzznJHrTQ8J6DhWaCGX5E4amT9+trymqPm5GuBmvONkPP7RtBRe1qg7yFkPp0X0vW8AUc9Guiov8W9R230u76/Bc+fd3xXVBD4OwFH/b3ljlqN+3tyRz0a96lvY9/1/UNY8x8zO+offBz1jwYc9Wigo/4BmPQ/FpWZXHTVR475J8t3U+fDRQPtqM8DNUQW3p8tnw+VLz8L7G6B4xZx1F4eoneyyNz5xXJHrTT8RUDDn4Ea/kriqJH16zfLa46ak98Eas7vQs7vd0FH7WmBvoeQ+XRBSNcLYV1NustRRbBj+e9RTBBYdY7uN1sxu92lGne2Yn/oC+pXZDPxf4lcDH8TA2888fm2VUPkuLMX49hMXAAW/xzF7N5MqLFmL4bPx5zFZGtO4NIOR81LTuGac6ka5ioms3HIVcz8xmGk0MYhdzFB4NwCG4c8lm8c1LjzkGwcVCLnEbiJgTee+HzbqiFy3HlJNg65gGO+zPKNgxprXoGNQz7LNw5qXvIJ15xL1TC/0MYhfzH59/BHAN/DLwC8h0xulgoUk9ksFSwmCFxQYLNUyPLNkhp3IUObpcClHU7+MCv6rcP8wDlCzndhyxdQVegKCyygRSxfQNWYiwiMu6jQoqf6zfwRELQm0nOGuMcLCWx6kPd7McvzXmlYTEDDwkANo0mMFnLNibF8nVBzEiNQL2OF6mVsMbm3ey+mReDSDgeZT8oo5I36Y58VeaC5nSiZ+zUKyhkn+tnOyFyrGH5dwp3Pkm4r5bbSbivjtrJuK+e28m6r4LaKbqvktsvdVtltV7jtSrdd5bYqbrvabde47Vq3VXVbNbdVd1sNt9V0W8Btjtvi3BZ0W7zbEtyWWCzqz58hLRHeQESeK+lzrpTPudI+58r4nCvrc66cz7nyPucq+Jyr6HOuks+5y33OVfY5d4XPuSt9zl3lc66Kz7mrfc5d43PuWp9zVX3OVfM5V93nXA2fczV9zgV8zjk+5+J8zgV9zsX7nEvwOZfos1mtFP63QfjfwKUdfyo6l1osSwAKr/fZ55KgvtQYS0H6+o9epS+9r7iwXk6ZS+0r/r/aO2Uvra9AxDw65S6lr7g/5YRT/t/3FciUX06Ff9lXYsZfctWp+O/6CvnkvVPp3/QV8r2HnMv/eV9JF7kfncr/tK+ki97bzhX/rK84TZ1wrvwnfSVpa45z1d/vK+1/1C+nyt/tK+l/1kLn6r/XV+Bv1FXnmr/TV+Bv1Wjn2v/dV8LfrPdO1f/VV/zfXjucatq+4jP+wTrkVNf1lfSP1jSnxsX7Cv3D9dGpeZG+kjP+8VrrBPz7CvyLddtx/PoK/Ks9gBP3176cf7mfcIKZ++rxr/cmTvyf+wpewj7HSYjoKy7jkvZMTiLJL2kSi+H6SoKNOWj0r3GTgHMVyRsqJggcEvgNSzIwGaTGnVzsD4FB/Rr9a1xcYehh7K9xa4U1r535tya1wkkYea52Mfm/xkVULc+R1gImfW3w5Erc4LWK4X9NXYtktUsAznUd2JgT402udnWEVru6xQSB6wqsdvUsX+3UuOuRr3YJsGRLTvPBFVnt6oc1b5B5tavvs9o1MLDaJQBXu/rApG8gNLnoqo8cc0Nc9fR9I/pS+ZLDRQP9AQakNWgE3i2gi5aa40YCuyTbx+3lDnrcjUl2h8gcbyJcJwKXdjhqTpoI1IlGQA2bEtwvTQXul2bgHbq3V2kWwSqlBTqfmgDzqbmQrs2Lyf/FRTxQhxYwHeLTTTrXFuD5846WxQSBWwo411aWO1c17lbkzjUelmypcT64Is61dVjzNpmda2sf59rGgHNFVC3PubYGJn0boclFV33kmNtaviNtHi4a6D99ag7UEFl421k+Hypf2gnsboHjFvkzGi8P0TtZZO60t9wZKQ3bC2jYDqjhdSS/lUDWr+strzlqTq4XqDk3CDm/GwQdtacF+h5C5lMHIV07GHDUQaAON8J0SIoz6ahvBM+fd9xUTBD4JgFHfbPljlqN+2ZyRx2EJVso3QdXxFF3DGt+S2ZH3dHHUd9iwFEjqpbnqDsCk/4WoclFV33kmG+1fDfVIVw00I66A1BDZOG9zfL5UPlym8DuFjhuEUft5SF6J4vMnU6WO2qlYScBDW8DatiZxFEj61cXy2uOmpMuAjWnq5Dz6yroqD0t0PcQMp+6CenazYCjjgPq0B2mQ7rRbwXsDp4/70gpJgicIuCoUy131GrcqeSOOg6WbE6GD66Io04La94js6NO83HUPQw4akTV8hx1GjDpewhNLrrqI8ecbvluqlu4aKAddTeghsjCm2H5fKh8yRDY3QLHLeKovTxE72SRudPTcketNOwpoGEGUMPbSRw1sn7dYXnNUXNyh0DNuVPI+d0p6Kg9LdD3EDKfegnp2suAo3aAOtwF0yFo1FHfBZ4/77i7mCDw3QKO+h7LHbUa9z3kjtqBJVuaMUfdO6z5vZkddW8fR32vAUeNqFqeo+4NTPp7hSYXXfWRY77P8t1Ur3DRQDvqXkANkYX3fsvnQ+XL/QK7W+C4RRy1l4fonSwyd/pY7qiVhn0ENLwfqGFfEkeNrF/9LK85ak76CdSc/kLOr7+go/a0QN9DyHwaIKTrAAOOOgDUYSBMhxSj33c5EDx/3jGomCDwIAFHPdhyR63GPZjcUQdgyZZo7Psuh4Q1fyCzox7i46gfMOCoEVXLc9RDgEn/gNDkoqs+cswPWr6bGhAuGmhHPQCoIbLwPmT5fKh8eUhgdwsct4ij9vIQvZNF5s5Qyx210nCogIYPATV8mMRRI+vXI5bXHDUnjwjUnEeFnN+jgo7a0wJ9DyHzaZiQrsMMOOqaQB0eg+kQl2zSUT8Gnj/veLyYIPDjAo76CcsdtRr3E+SOuiYs2Xok+eCKOOrhYc2fzOyoh/s46icNOGpE1fIc9XBg0j8pNLnoqo8c81OW76aGhYsG2lEPA2qILLxPWz4fKl+eFtjdAsct4qi9PETvZJG5M8JyR600HCGg4dNADUeSOGpk/Rplec1RczJKoOaMFnJ+owUdtacF+h5C5tMYIV3HGHDUNYA6jIXpkBoy6ajHgufPO8YVEwQeJ+Cox1vuqNW4x5M76hqwZIsP+eCKOOoJYc2fyeyoJ/g46mcMOGpE1fIc9QRg0j8jNLnoqo8c87OW76bGhIsG2lGPAWqILLzPWT4fKl+eE9jdAsct4qi9PETvZJG5M9FyR600nCig4XNADZ8ncdTI+vWC5TVHzckLAjXnRSHn96Kgo/a0QN9DyHyaJKTrJAOOujpQh5dgOiQY/dT3S+D5846XiwkCvyzgqF+x3FGrcb9C7qir437tZOxT35PDmk/J7Kgn+zjqKQYcNaJqeY56MjDppwhNLrrqI8c81fLd1KRw0UA76klADZGFd5rl86HyZZrA7hY4bhFH7eUheieLzJ3pljtqpeF0AQ2nATWcQeKokfVrpuU1R83JTIGaM0vI+c0SdNSeFuh7CJlPs4V0nW3AUVcD6jAH9w5NgklHPQc8f94xt5gg8FwBRz3Pcketxj2P3FFXw5muVB9cEUc9P6z5gsyOer6Po15gwFEjqpbnqOcDk36B0OSiqz5yzAst303NDhcNtKOeDdQQWXgXWT4fKl8WCexugeMWcdReHqJ3ssjcWWy5o1YaLhbQcBFQwyUkjhpZv5ZaXnPUnCwVqDnLhJzfMkFH7WmBvoeQ+bRcSNflBhx1VaAOK3D7yUSTjnoFeP68Y2UxQeCVAo56leWOWo17Fbmjror7tVOKD66Io14d1nxNZke92sdRrzHgqBFVy3PUq4FJv0ZoctFVHznmtZbvppaHiwbaUS8HaogsvOssnw+VL+sEdrfAcYs4ai8P0TtZZO6st9xRKw3XC2i4DqjhBhJHjaxfGy2vOWpONgrUnE1Czm+ToKP2tEDfQ8h82iyk62YDjvpaoA5bYDqEjD49awt4/rxjazFB4K0Cjnqb5Y5ajXsbuaO+FpZsScaenrU9rPmrmR31dh9H/aoBR42oWp6j3g5M+leFJhdd9ZFjfs3y3dTmcNFAO+rNQA2RhXeH5fOh8mWHwO4WOG4RR+3lIXoni8ydnZY7aqXhTgENdwA1fJ3EUSPr1xuW1xw1J28I1Jw3hZzfm4KO2tMCfQ8h82mXkK67DDjqa4A6vEXqqN8Cz593vF1MEPhtAUf9juWOWo37HXJHfQ2ho94d1nxPZke928dR7zHgqBFVy3PUu4FJv4fEUSPHvNfy3dSucNFAO+pdQA2RhXef5fOh8mWfwO4WOG4RR+3lIXoni8yd/ZY7aqXhfgEN9wE1PEDiqJH166DlNUfNyUGBmnNIyPkdEnTUnhboewiZT+8K6fquAUd9NVCH92A6JBj9ru/3wPPnHe8XEwR+X8BRf2C5o1bj/oDcUV8NS7YUY9/1fTis+YeZHfVhH0f9oQFHjahanqM+DEz6D4UmF131kWP+yPLd1LvhooF21O8CNUQW3o8tnw+VLx8L7G6B4xZx1F4eoneyyNw5YrmjVhoeEdDwY6CGn5A4amT9+tTymqPm5FOBmvOZkPP7TNBRe1qg7yFkPh0V0vWoAUddBajD5zhH3cOko/4cPH/e8UUxQeAvBBz1l5Y7ajXuL8kddRWc6Qr64Io46mNhzY9ndtTHfBz1cQOOGlG1PEd9DJj0x4UmF131kWM+Yflu6mi4aKAd9VGghsjCe9Ly+VD5clJgdwsct4ij9vIQvZNF5s4pyx210vCUgIYngRqeJnHUyPp1xvKao+bkjEDNOSvk/M4KOmpPC/Q9hMync0K6njPgqK8C6vAVTIc4o+9RfwWeP+/4upgg8NcCjvobyx21Gvc35I76Kliy9TD2HvX5sObfZnbU530c9bcGHDWianmO+jww6b8Vmlx01UeO+TvLd1PnwkUD7ajPATVEFt7vLZ8PlS/fC+xugeMWcdReHqJ3ssjc+cFyR600/EFAw++BGv5I4qiR9esny2uOmpOfBGrOz0LO72dBR+1pgb6HkPn0i5Cuvxhw1FcCdfgVpkMwaNJR/wqeP+/4rZgg8G8Cjvp3yx21Gvfv5I76SliypfXwwRVx1Bc8zaOj/uyeL/g4avVD0o4aUbU8R30BmfTRMpOLrvrIMWeLtns39Uu4aKAd9S9ADZGFN7vl86HyRTGid7fAcYs4ai8P0TtZZO7kENYwcGnH/93LihGtYWTuXKqGOcEaegd6DUDWr1yW1xw1J7kEak5u4FxH7qFyR8s5ak8L9D2EzKc8QrrmiZZ31FcAdcgL0yHd6HvUecHz5x2XRQsCXxaN7zcfcGGRGne+6D8EBvVr1FFfAXPUjrH3qPOHNS+Q2VHnj/6roy5gwFFfAXTU+YFJXyBaZnLRVR855oKW76byhIsG2lHnAWqILLyFLJ8PlS+FBHa3hcBOBs3n5SF6J4vMncKWO2qlYWEBDQsBNSxC4qiR9auo5TVHzUlRgZpTTMj5FRN01J4W6HsImU/RQrpGG3DUlYGOOgamQ7xRRx0Dnj/viI0WBI4VcNTFLXfUatzFyR11ZZijTjXmqEuENS+Z2VGX8HHUJQ046spAR10CmPQlo2UmF131kWMuZfluKjpcNNCOOhqoIbLwlrZ8PlS+lBbY3QLHLeKovTxE72SRuVPGcketNCwjoGFpoIZlSRw1sn6Vs7zmqDkpJ1Bzygs5v/KCjtrTAn0PIfOpgpCuFQw46suBjroiTIekZJOOuiJ4/ryjUrQgcCUBR3255Y5ajftyckd9OcxRh5J8cEUcdeWw5ldkdtSVfRz1FQYc9eVAR10ZmPRXRMtMLvz3qMAxX2n5bqpCuGigHXUFoIbIwnuV5fOh8uUqgd0tcNwijtrLQ/ROFpk7VSx31ErDKgIaXgXU8GoSR42sX9dYXnPUnFwjUHOuFXJ+1wo6ak8L9D2EzKeqQrpWNeCoKwEddTXcOzRGHXU18Px5R/VoQeDqAo66huWOWo27BrmjrgRz1PHGHHXNsOaBzI66po+jDhhw1JWAjromMOkD0TKTi676yDE7lu+mqoaLBtpRVwVqiCy8cZbPh8qXOIHdLXDcIo7ay0P0ThaZO0HLHbXSMCigYRxQw3gSR42sXwmW1xw1JwkCNSdRyPklCjpqTwv0PYTMpyQhXZMMOOqKQEcdwr1HHTDpqEPg+fOO5GhB4GQBR13Lcketxl2L3FFXhDnq5IAProijrh3WvE5mR13bx1HXMeCoKwIddW1g0teJlplcdNVHjrmu5buppHDRQDvqJKCGyMJbz/L5UPlST2B3Cxy3iKP28hC9k0XmTn3LHbXSsL6AhvWAGjYgcdTI+tXQ8pqj5qShQM1pJOT8Ggk6ak8L9D2EzKfGQro2NuCoKwAddRPcftIx6aibgOfPO5pGCwI3FXDUzSx31GrczcgddQWYo07M8MEVcdTNw5q3yOyom/s46hYGHHUFoKNuDkz6FtEyk4uu+sgxt7R8N9U4XDTQjroxUENk4W1l+XyofGklsLsFjlvEUXt5iN7JInOnteWOWmnYWkDDVkAN25A4amT9amt5zVFz0lag5rQTcn7tBB21pwX6HkLmU3shXdsbcNTlgY76OtxnHo0+Pes68Px5x/XRgsDXCzjqGyx31GrcN5A76vK4byYz9vSsDmHNb8zsqDv4OOobDTjq8kBH3QGY9DdGy0wuuuojx3yT5bup9uGigXbU7YEaIgvvzZbPh8qXmwV2t8BxizhqLw/RO1lk7nS03FErDTsKaHgzUMNbSBw1sn7dannNUXNyq0DNuU3I+d0m6Kg9LdD3EDKfOgnp2smAoy4HdNSdYTqkG32PujN4/ryjS7QgcBcBR93Vcketxt2V3FGXwz09y9h71N3CmnfP7Ki7+Tjq7gYcdTmgo+4GTPru0TKTi676yDGnWL6b6hQuGmhH3QmoIbLwplo+HypfUgV2t8BxizhqLw/RO1lk7qRZ7qiVhmkCGqYCNexB4qiR9Svd8pqj5iRdoOZkCDm/DEFH7WmBvoeQ+dRTSNeeBhx1WaCjvh2mQ0aCSUd9O3j+vOOOaEHgOwQc9Z2WO2o17jvJHXVZmKMOpPrgijjqXmHN78rsqHv5OOq7DDjqskBH3QuY9HdFy0wuuuojx3y35bupnuGigXbUPYEaIgvvPZbPh8qXewR2t8BxizhqLw/RO1lk7vS23FErDXsLaHgPUMN7SRw1sn7dZ3nNUXNyn0DNuV/I+d0v6Kg9LdD3EDKf+gjp2seAoy4DdNR9YTokG/3Ud1/w/HlHv2hB4H4Cjrq/5Y5ajbs/uaMug/s7amOf+h4Q1nxgZkc9wMdRDzTgqMsAHfUAYNIPjJaZXHTVR455kOW7qT7hooF21H2AGiIL72DL50Ply2CB3S1w3CKO2stD9E4WmTtDLHfUSsMhAhoOBmr4AImjRtavBy2vOWpOHhSoOQ8JOb+HBB21pwX6HkLm01AhXYcacNSlgY76Ydx71Ea/6/th8Px5xyPRgsCPCDjqRy131Grcj5I76tK4T30b+67vYWHNH8vsqIf5OOrHDDjq0kBHPQyY9I9Fy0wuuuojx/y45bupoeGigXbUQ4EaIgvvE5bPh8qXJwR2t8BxizhqLw/RO1lk7gy33FErDYcLaPgEUMMnSRw1sn49ZXnNUXPylEDNeVrI+T0t6Kg9LdD3EDKfRgjpOiKsq0l3WaoYdizeMTJaEHikgLscZbm7VOMeJeAu/VgRN8gogZsYeOOJz7etGiLHPZpkMzECOOYxlm8m1FhHC2wmxlq++VbzMla45lyqhuOENg7j/h9sHEoKbRzGRwsCjxfYOEywfOOgxj2BZOOgEnmCwE0MvPHE59tWDZHjfoZk4zAOOOZnLd84qLE+I7BxeM7yjYOal+eEa86lajhRaOMw0cB7+CWA7+E/D7yHTG6Wno+W2Sy9EC0I/ILAZulFyzdLatwvGtosBS7tcCaGWdFvHU4EzhFyvidZvoCqQjdJYAF9yfIFVI35JYFxvyy06L3s8xEQtCbSc4a4x18U2PQg7/dXLM97peErAhpOAmo4mcRoIdecKZavE2pOpgjUy6lC9XKq4Nu9F9MicGmHg8wnZRTyRv2xz4o80NxxUTL3axSUM070s52RuVYx/Hq6O58z3DbTbbPcNtttc9w2123z3DbfbQvcttBti9y22G1L3LbUbcvcttxtK9y20m2r3LbabWvcttZt69y23m0b3LbRbZvcttltW9y21W3boqP+/BnS6eENROS5GT7nZvqcm+VzbrbPuTk+5+b6nJvnc26+z7kFPucW+pxb5HNusc+5JT7nlvqcW+ZzbrnPuRU+51b6nFvlc261z7k1PufW+pxb53Nuvc+5DT7nNvqc2+RzbrPPuS0+57b6nNvms1mtFP63QfjfwKUdfyo6l1ospwMKr/fZ5xmgvtQYZ0L6+o9esy69r7iwXs7sS+0r/r/aO3Mura9AxDw6cy+lr7g/5YQz79/3FciUX878f9lXYsZfctVZ8O/6CvnkvbPw3/QV8r2HnEX/vK+ki9yPzuJ/2lfSRe9tZ8k/6ytOUyecpf+kryRtzXGW/f2+0v5H/XKW/92+kv5nLXRW/L2+An+jrjor/05fgb9Vo51V/7uvhL9Z753V/6uv+L+9djhrtH3FZ/yDdchZq+sr6R+tac66i/cV+ofro7P+In0lZ/zjtdbZ4N9X4F+s285Gv74C/2oP4Gz6a1/Ov9xPOJsz99XjX+9NnC1/7it4CfscZ2tEX3EZl7RncraR/JJmWzSur+2wMQeN/jXuduBcRfK+Gi0I/KrAb1heAyaD1Lhfi/5DYFC/Rv8aF1cYehj7a9wdYc13Zv6tyY5wEkae2xkt/9e4iKrlOdIdwKTfCZ5ciRt8RzT+19Q7SFa7rcC5fh025sR4k6vd60Kr3RvRgsBvCKx2b1q+2qlxv0m+2m2FJVtymg+uyGq3K6z5W5lXu10+q91bBla7rcDVbhcw6d8Smlx01UeO+W1c9fR9I/pS+V4LFw30BxiQ1uAd8G4BXbTUHL8jsEuyfdxe7qDHvZtkd4jM8T3CdSJwaYej5mSPQJ14B6jhXoL7Za/A/bIPvEP39ir7IliltEDn0x5gPu0X0nV/tPxfXGwB6nAApkN8uknnegA8f95xMFoQ+KCAcz1kuXNV4z5E7ly3wJItNc4HV8S5vhvW/L3MzvVdH+f6ngHniqhannN9F5j07wlNLrrqI8f8vuU70v3hooH+06f9QA2RhfcDy+dD5csHArtb4LhF/ozGy0P0ThaZO4ctd0ZKw8MCGn4A1PBDkt9KIOvXR5bXHDUnHwnUnI+FnN/Hgo7a0wJ9DyHz6YiQrkcMOOrNQB0+gemQFGfSUX8Cnj/v+DRaEPhTAUf9meWOWo37M3JHvRmWbKF0H1wRR300rPnnmR31UR9H/bkBR42oWp6jPgpM+s+FJhdd9ZFj/sLy3dSRcNFAO+ojQA2RhfdLy+dD5cuXArtb4LhFHLWXh+idLDJ3jlnuqJWGxwQ0/BKo4XESR42sXycsrzlqTk4I1JyTQs7vpKCj9rRA30PIfDolpOspA456E1CH0zAd0o1+K+Bp8Px5x5loQeAzAo76rOWOWo37LLmj3gRLNifDB1fEUZ8La/5VZkd9zsdRf2XAUSOqlueozwGT/iuhyUVXfeSYv7Z8N3UqXDTQjvoUUENk4f3G8vlQ+fKNwO4WOG4RR+3lIXoni8yd85Y7aqXheQENvwFq+C2Jo0bWr+8srzlqTr4TqDnfCzm/7wUdtacF+h5C5tMPQrr+YMBRbwTq8CNMh6BRR/0jeP6846doQeCfBBz1z5Y7ajXun8kd9UZYsqUZc9S/hDX/NbOj/sXHUf9qwFEjqpbnqH8BJv2vQpOLrvrIMf9m+W7qh3DRQDvqH4AaIgvv75bPh8qX3wV2t8BxizhqLw/RO1lk7lyw3FErDS8IaPg7cuMTw+GokfUrW4zdNUfNiWJE39PZgXMduYfKHiPnqD0t0PcQMp9yCOmaI0beUW8A6pATpkOK0e+7zAmeP+/IFSMInCsG32/uGLsdtRp37pg/BAb1a9RRb4BtWhKNfd9lnrDmeWOi/uye88T81VGrH5J21BuAjjoPMOnzxshMLrrqI8d8meW7qRzhooF21DmAGiILbz7L50PlSz6B3S1w3CKO2stD9E4WmTv5hTUMXNrxf/dyfgEN8wE1LEDiqJH1q6DlNUfNSUGBmlNIyPkVEnTUnhboewiZT4WFdC1swFGvBzrqIjAd4pJNOuoi4PnzjqIxgsBFBRx1McsdtRp3MXJHvR7mqHsk+eCKOOrosOYxmR11tI+jjjHgqNcDHXU0MOljYmQmF131kWOOtXw3VThcNNCOujBQQ2ThLW75fKh8KS6wuwWOW8RRe3mI3skic6eE5Y5aaVhCQMPiQA1LkjhqZP0qZXnNUXNSSqDmlBZyfqUFHbWnBfoeQuZTGSFdyxhw1OuAjrosTIfUkElHXRY8f95RLkYQuJyAoy5vuaNW4y5P7qjXwRx1fMgHV8RRVwhrXjGzo67g46grGnDU64COugIw6SvGyEwuuuojx1zJ8t1UmXDRQDvqMkANkYX3csvnQ+XL5QK7W+C4RRy1l4fonSwydypb7qiVhpUFNLwcqOEVJI4aWb+utLzmqDm5UqDmXCXk/K4SdNSeFuh7CJlPVYR0rWLAUa8FOuqrYTokGP3U99Xg+fOOa2IEga8RcNTXWu6o1bivJXfUa2GOOtXYp76rhjWvltlRV/Vx1NUMOOq1QEddFZj01WJkJhdd9ZFjrm75bqpKuGigHXUVoIbIwlvD8vlQ+VJDYHcLHLeIo/byEL2TReZOTcsdtdKwpoCGNYAaBkgcNbJ+OZbXHDUnjkDNiRNyfnGCjtrTAn0PIfMpKKRr0ICjXgN01PG4d2gSTDrqePD8eUdCjCBwgoCjTrTcUatxJ5I76jU4R53qgyviqJPCmocyO+okH0cdMuCo1wAddRIw6UMxMpOLrvrIMSdbvpsKhosG2lEHgRoiC28ty+dD5Ustgd0tcNwijtrLQ/ROFpk7tS131ErD2gIa1gJqWIfEUSPrV13La46ak7oCNaeekPOrJ+ioPS3Q9xAyn+oL6VrfgKNeDXTUDXD7yUSTjroBeP68o2GMIHBDAUfdyHJHrcbdiNxRr8Z96jvFB1fEUTcOa94ks6Nu7OOomxhw1KuBjroxMOmbxMhMLrrqI8fc1PLdVP1w0UA76vpADZGFt5nl86HypZnA7hY4bhFH7eUheieLzJ3mljtqpWFzAQ2bATVsQeKokfWrpeU1R81JS4Ga00rI+bUSdNSeFuh7CJlPrYV0bW3AUa8COuo2MB1CRp+e1QY8f97RNkYQuK2Ao25nuaNW425H7qhXwRx1krGnZ7UPa35dZkfd3sdRX2fAUa8COur2wKS/LkZmctFVHznm6y3fTbUOFw20o24N1BBZeG+wfD5UvtwgsLsFjlvEUXt5iN7JInOng+WOWmnYQUDDG4Aa3kjiqJH16ybLa46ak5sEas7NQs7vZkFH7WmBvoeQ+dRRSNeOBhz1SqCjvoXUUd8Cnj/vuDVGEPhWAUd9m+WOWo37NnJHvZLQUXcKa945s6Pu5OOoOxtw1CuBjroTMOk7kzhq5Ji7WL6b6hguGmhH3RGoIbLwdrV8PlS+dBXY3QLHLeKovTxE72SRudPNcketNOwmoGFXoIbdSRw1sn6lWF5z1JykCNScVCHnlyroqD0t0PcQMp/ShHRNM+CoVwAddQ+YDglGv+u7B3j+vCM9RhA4XcBRZ1juqNW4M8gd9QqYo04x9l3fPcOa357ZUff0cdS3G3DUK4COuicw6W+PkZlcdNVHjvkOy3dTaeGigXbUaUANkYX3TsvnQ+XLnQK7W+C4RRy1l4fonSwyd3pZ7qiVhr0ENLwTqOFdJI4aWb/utrzmqDm5W6Dm3CPk/O4RdNSeFuh7CJlPvYV07W3AUS8HOup7cY66h0lHfS94/rzjvhhB4PsEHPX9ljtqNe77yR31cpyjDvrgijjqPmHN+2Z21H18HHVfA456OdBR9wEmfd8YmclFV33kmPtZvpvqHS4aaEfdG6ghsvD2t3w+VL70F9jdAsct4qi9PETvZJG5M8ByR600HCCgYX+ghgNJHDWyfg2yvOaoORkkUHMGCzm/wYKO2tMCfQ8h82mIkK5DDDjqZUBH/QBMhzij71E/AJ4/73gwRhD4QQFH/ZDljlqN+yFyR70M5qh7GHuPemhY84czO+qhPo76YQOOehnQUQ8FJv3DMTKTi676yDE/Yvluaki4aKAd9RCghsjC+6jl86Hy5VGB3S1w3CKO2stD9E4WmTvDLHfUSsNhAho+CtTwMRJHjaxfj1tec9ScPC5Qc54Qcn5PCDpqTwv0PYTMp+FCug434KiXAh31kzAdgkGTjvpJ8Px5x1MxgsBPCTjqpy131GrcT5M76qUwR53WwwdXxFGPCGs+MrOjHuHjqEcacNRLgY56BDDpR8bITC666iPHPMry3dTwcNFAO+rhQA2RhXe05fOh8mW0wO4WOG4RR+3lIXoni8ydMZY7aqXhGAENRwM1HEviqJH1a5zlNUfNyTiBmjNeyPmNF3TUnhboewiZTxOEdJ1gwFEvATrqZ2A6pBt9j/oZ8Px5x7MxgsDPCjjq5yx31Grcz5E76iUwR+0Ye496Yljz5zM76ok+jvp5A456CdBRTwQm/fMxMpOLrvrIMb9g+W5qQrhooB31BKCGyML7ouXzofLlRYHdLXDcIo7ay0P0ThaZO5Msd9RKw0kCGr4I1PAlEkeNrF8vW15z1Jy8LFBzXhFyfq8IOmpPC/Q9hMynyUK6TjbgqBcDHfUUmA7xRh31FPD8ecfUGEHgqQKOeprljlqNexq5o14Mc9Spxhz19LDmMzI76uk+jnqGAUe9GOiopwOTfkaMzOSiqz5yzDMt301NDhcNtKOeDNQQWXhnWT4fKl9mCexugeMWcdReHqJ3ssjcmW25o1YazhbQcBZQwzkkjhpZv+ZaXnPUnMwVqDnzhJzfPEFH7WmBvoeQ+TRfSNf5Bhz1IqCjXgDTISnZpKNeAJ4/71gYIwi8UMBRL7LcUatxLyJ31ItgjjqU5IMr4qgXhzVfktlRL/Zx1EsMOOpFQEe9GJj0S2JkJhf+e1TgmJdavpuaHy4aaEc9H6ghsvAus3w+VL4sE9jdAsct4qi9PETvZJG5s9xyR600XC6g4TKghitIHDWyfq20vOaoOVkpUHNWCTm/VYKO2tMCfQ8h82m1kK6rDTjqhUBHvQb3Do1RR70GPH/esTZGEHitgKNeZ7mjVuNeR+6oF8IcdbwxR70+rPmGzI56vY+j3mDAUS8EOur1wKTfECMzueiqjxzzRst3U6vDRQPtqFcDNUQW3k2Wz4fKl00Cu1vguEUctZeH6J0sMnc2W+6olYabBTTcBNRwC4mjRtavrZbXHDUnWwVqzjYh57dN0FF7WqDvIWQ+bRfSdbsBR70A6Khfxb1HHTDpqF8Fz593vBYjCPyagKPeYbmjVuPeQe6oF8AcdXLAB1fEUe8Ma/56Zke908dRv27AUS8AOuqdwKR/PUZmctFVHznmNyzfTW0PFw20o94O1BBZeN+0fD5UvrwpsLsFjlvEUXt5iN7JInNnl+WOWmm4S0DDN4EavkXiqJH1623La46ak7cFas47Qs7vHUFH7WmBvoeQ+bRbSNfdBhz1fKCj3oPbTzomHfUe8Px5x94YQeC9Ao56n+WOWo17H7mjng9z1IkZPrgijnp/WPMDmR31fh9HfcCAo54PdNT7gUl/IEZmctFVHznmg5bvpnaHiwbaUe8GaogsvIcsnw+VL4cEdrfAcYs4ai8P0TtZZO68a7mjVhq+K6DhIaCG75E4amT9et/ymqPm5H2BmvOBkPP7QNBRe1qg7yFkPh0W0vWwAUc9D+ioP8R95tHo07M+BM+fd3wUIwj8kYCj/thyR63G/TG5o56H+2YyY0/POhLW/JPMjvqIj6P+xICjngd01EeASf9JjMzkoqs+csyfWr6bOhwuGmhHfRioIbLwfmb5fKh8+Uxgdwsct4ij9vIQvZNF5s5Ryx210vCogIafATX8nMRRI+vXF5bXHDUnXwjUnC+FnN+Xgo7a0wJ9DyHz6ZiQrscMOOq5QEd9HKZDutH3qI+D5887TsQIAp8QcNQnLXfUatwnyR31XNzTs4y9R30qrPnpzI76lI+jPm3AUc8FOupTwKQ/HSMzueiqjxzzGct3U8fCRQPtqI8BNUQW3rOWz4fKl7MCu1vguEUctZeH6J0sMnfOWe6olYbnBDQ8C9TwKxJHjaxfX1tec9ScfC1Qc74Rcn7fCDpqTwv0PYTMp/NCup434KjnAB31tzAdMhJMOupvwfPnHd/FCAJ/J+Cov7fcUatxf0/uqOfAHHUg1QdXxFH/ENb8x8yO+gcfR/2jAUc9B+iofwAm/Y8xMpOLrvrIMf9k+W7qfLhooB31eaCGyML7s+XzofLlZ4HdLXDcIo7ay0P0ThaZO79Y7qiVhr8IaPgzUMNfSRw1sn79ZnnNUXPym0DN+V3I+f0u6Kg9LdD3EDKfLgjpesGAo54NdNRRsSgdko1+6hvH/WdHnS1WEFh1ju43e6zdjlqNO3vsHwKD+jXqqGfj/o7a2Ke+c4Q1zxkb9Wf3nCP2r45a/ZC0o54NdNQ5gEmfM1ZmctFVHznmXLHAGzwKf8OpVVQVDbSjvgDcQSALb27L50PlS+5Y/O4WOG4RR+3lIXoni8ydPMIaBi7t+L97OY+AhrmBGuYFa+gd6DUAWb8us7zmqDm5TKDm5AM7B28PlS9WzlF7WqDvIWQ+5RfSNX+svKOeBXTUBWA6ZBj9ru8C4PnzjoKxgsAFBRx1IcsdtRp3IXJHPQv3qW9j3/VdOKx5kcyOurCPoy5iwFHPAjrqwsCkLxIrM7noqo8cc1HLd1P5w0UD7ajzAzVEFt5ils+HypdiArtb4LhFHLWXh+idLDJ3oi131ErDaAENiwE1jCFx1Mj6FWt5zVFzEitQc4oLOb/igo7a0wJ9DyHzqYSQriXCupp0lzOjsWPxjpKxgsAlBdxlKcvdpRp3KQF36ceKuEFKCdzEwBtPfL5t1RA57tIkm4kSwDGXsXwzocZaWmAzUdbyzbeal7LCNedSNSwntHEo9/9g4zBDaONQPlYQuLzAxqGC5RsHNe4KJBsHlcgVBG5i4I0nPt+2aogcd0WSjUM54JgrWb5xUGOtKLBxuNzyjYOal8uFa86lalhZaONQ2cB7+NOB7+FfAbyHTG6WroiV2SxdGSsIfKXAZukqyzdLatxXGdosBS7tcCqHWdFvHVYGzhFyvqtYvoCqQldFYAG92vIFVI35aoFxXyO06F3j8xEQtCbSc4a4x68S2PQg7/drLc97peG1AhpWAWpYlcRoIdecapavE2pOqgnUy+pC9bK64Nu9F9MicGmHg8wnZRTyRv2xz/LT4VL/H/FC+gL7kvs8ZyBO9LOikblbMfy6ppsfAbc5botzW9Bt8W5LcFui25LcFnJbsttqua222+q4ra7b6rmtvsovtzV0WyO3NXZbE7c1dVsztzV3Wwu3tXRbK7e1dlsbt7V1W7vYqD9/JrVmeEMSeS7gc87xORfncy7ocy7e51yCz7lEn3NJPudCPueSfc7V8jlX2+dcHZ9zdX3O1fM5V9/nXAOfcw19zjXyOdfY51wTn3NNfc418znX3OdcC59zLX3OtfI519rnXBufc219zrWL2Pyii5jqQxWySpn6DVza4SAZawIWBu+z2QFQX2qMDqSv/+gVd+l9xYX1coKX2lf8f7V34i+tr0DEPDoJl9JX3J9ywkn8930FMuWXk/Qv+0rM+EuuOqF/11fIJ++d5H/TV8j3HnJq/fO+ki5yPzq1/2lfSRe9t506/6yvOE2dcOr+k76StDXHqff3+0r7H/XLqf93+0r6n7XQafD3+gr8jbrqNPw7fQX+Vo12Gv3vvhL+Zr13Gv+vvuL/9trhNNH2FZ/xD9Yhp6mur6R/tKY5zS7eV+gfro9O84v0lZzxj9dap4V/X4F/sW47Lf36CvyrPYDT6q99Of9yP+G0ztxXj3+9N3Ha/Lmv4CXsc5y2EX3FZVzSnslpR/JLpHaxuL7aw8YcNPrXwu2BcxXJe12sIPB1Ar8Buh6YDFLjvj72D4FB/Rr9a2FcYehh7K+Fbwhr3iHzb2FuCCdh5LkOsfJ/LYyoWp4jvQGY9B3Akytxg98Qi/8txg0kq11b4FzfCBtzYrzJ1e5GodXuplhB4JsEVrubLV/t1LhvJl/t2sKSLTnNB1dktesY1vyWzKtdR5/V7hYDq11b4GrXEZj0twhNLrrqI8d8K656+r5Rfql814eLBvoDFkhrcBt4t4AuWmqObxPYJdk+bi930OPuRLI7ROZ4Z+E6Ebi0w1Fz0lmgTtwG1LALwf3SReB+6QreoXt7la4RrFJaoPOpMzCfugnp2i1W/i9C2gB16A7TIT7dpHPtDp4/70iJFQROEXCuqZY7VzXuVHLn2gaWbKlxPrgizjUtrHmPzM41zce59jDgXBFVy3OuacCk7yE0ueiqjxxzuuU70m7hooH+06xuQA2RhTfD8vlQ+ZIhsLsFjlvkz3y8PETvZJG509NyZ6Q07CmgYQZQw9tJfiuBrF93WF5z1JzcIVBz7hRyfncKOmpPC/Q9hMynXkK69jLgqFsDdbgLpkNSnElHfRd4/rzj7lhB4LsFHPU9ljtqNe57yB11a1iyhdJ9cEUcde+w5vdmdtS9fRz1vQYcNaJqeY66NzDp7xWaXHTVR475Pst3U73CRQPtqHsBNUQW3vstnw+VL/cL7G6B4xZx1F4eoneyyNzpY7mjVhr2EdDwfqCGfUkcNbJ+9bO85qg56SdQc/oLOb/+go7a0wJ9DyHzaYCQrgMMOOpWQB0GwnRIN/qthQPB8+cdg2IFgQcJOOrBljtqNe7B5I66FSzZnAwfXBFHPSSs+QOZHfUQH0f9gAFHjahanqMeAkz6B4QmF131kWN+0PLd1IBw0UA76gFADZGF9yHL50Ply0MCu1vguEUctZeH6J0sMneGWu6olYZDBTR8CKjhwySOGlm/HrG85qg5eUSg5jwq5PweFXTUnhboewiZT8OEdB1mwFG3BOrwGEyHoFFH/Rh4/rzj8VhB4McFHPUTljtqNe4nyB11S1iypRlz1MPDmj+Z2VEP93HUTxpw1Iiq5Tnq4cCkf1JoctFVHznmpyzfTQ0LFw20ox4G1BBZeJ+2fD5UvjwtsLsFjlvEUXt5iN7JInNnhOWOWmk4QkDDp4EajiRx1Mj6NcrymqPmZJRAzRkt5PxGCzpqTwv0PYTMpzFCuo4x4KhbAHUYC9Mhxej3XY4Fz593jIsVBB4n4KjHW+6o1bjHkzvqFrBkSzT2fZcTwpo/k9lRT/Bx1M8YcNSIquU56gnApH9GaHLRVR855mct302NCRcNtKMeA9QQWXifs3w+VL48J7C7BY5bxFF7eYjeySJzZ6LljlppOFFAw+eAGj5P4qiR9esFy2uOmpMXBGrOi0LO70VBR+1pgb6HkPk0SUjXSQYcdXOgDi/BdIhLNumoXwLPn3e8HCsI/LKAo37Fcketxv0KuaNuDku2Hkk+uCKOenJY8ymZHfVkH0c9xYCjRlQtz1FPBib9FKHJRVd95JinWr6bmhQuGmhHPQmoIbLwTrN8PlS+TBPY3QLHLeKovTxE72SRuTPdcketNJwuoOE0oIYzSBw1sn7NtLzmqDmZKVBzZgk5v1mCjtrTAn0PIfNptpCusw046mZAHebAdEgNmXTUc8Dz5x1zYwWB5wo46nmWO2o17nnkjroZLNniQz64Io56fljzBZkd9XwfR73AgKNGVC3PUc8HJv0CoclFV33kmBdavpuaHS4aaEc9G6ghsvAusnw+VL4sEtjdAsct4qi9PETvZJG5s9hyR600XCyg4SKghktIHDWyfi21vOaoOVkqUHOWCTm/ZYKO2tMCfQ8h82m5kK7LDTjqpkAdVsB0SDD6qe8V4PnzjpWxgsArBRz1KssdtRr3KnJH3RT3aydjn/peHdZ8TWZHvdrHUa8x4KgRVctz1KuBSb9GaHLRVR855rWW76aWh4sG2lEvB2qILLzrLJ8PlS/rBHa3wHGLOGovD9E7WWTurLfcUSsN1wtouA6o4QYSR42sXxstrzlqTjYK1JxNQs5vk6Cj9rRA30PIfNospOtmA466CVCHLbh3aBJMOuot4Pnzjq2xgsBbBRz1NssdtRr3NnJH3QRnulJ9cEUc9faw5q9mdtTbfRz1qwYcNaJqeY56OzDpXxWaXHTVR475Nct3U5vDRQPtqDcDNUQW3h2Wz4fKlx0Cu1vguEUctZeH6J0sMnd2Wu6olYY7BTTcAdTwdRJHjaxfb1hec9ScvCFQc94Ucn5vCjpqTwv0PYTMp11Cuu4y4KgbA3V4C7efTDTpqN8Cz593vB0rCPy2gKN+x3JHrcb9Drmjboz7tVOKD66Io94d1nxPZke928dR7zHgqBFVy3PUu4FJv0doctFVHznmvZbvpnaFiwbaUe8CaogsvPssnw+VL/sEdrfAcYs4ai8P0TtZZO7st9xRKw33C2i4D6jhARJHjaxfBy2vOWpODgrUnENCzu+QoKP2tEDfQ8h8eldI13cNOOpGQB3eg+kQMvr0rPfA8+cd78cKAr8v4Kg/sNxRq3F/QO6oG8GSLcnY07MOhzX/MLOjPuzjqD804KgRVctz1IeBSf+h0OSiqz5yzB9Zvpt6N1w00I76XaCGyML7seXzofLlY4HdLXDcIo7ay0P0ThaZO0csd9RKwyMCGn4M1PATEkeNrF+fWl5z1Jx8KlBzPhNyfp8JOmpPC/Q9hMyno0K6HjXgqBsCdfic1FF/Dp4/7/giVhD4CwFH/aXljlqN+0tyR92Q0FEfC2t+PLOjPubjqI8bcNSIquU56mPApD9O4qiRYz5h+W7qaLhooB31UaCGyMJ70vL5UPlyUmB3Cxy3iKP28hC9k0XmzinLHbXS8JSAhieBGp4mcdTI+nXG8pqj5uSMQM05K+T8zgo6ak8L9D2EzKdzQrqeM+CoGwB1+AqmQ4LR7/r+Cjx/3vF1rCDw1wKO+hvLHbUa9zfkjroBLNlSjH3X9/mw5t9mdtTnfRz1twYcNaJqeY76PDDpvxWaXHTVR475O8t3U+fCRQPtqM8BNUQW3u8tnw+VL98L7G6B4xZx1F4eoneyyNz5wXJHrTT8QUDD74Ea/kjiqJH16yfLa46ak58Eas7PQs7vZ0FH7WmBvoeQ+fSLkK6/GHDU9YE6/Ipz1D1MOupfwfPnHb/FCgL/JuCof7fcUatx/07uqOvjTFfQB1fEUV/wNC8e9Wf3fMHHUasfknbUiKrlOeoLyKQvLjO56KqPHHO24nbvpn4JFw20o/4FqCGy8Ga3fD5UvihG9O4WOG4RR+3lIXoni8ydHMIaBi7t+L97WTGiNYzMnUvVMCdYQ+9ArwHI+pXL8pqj5iSXQM3JDZzryD1U7uJyjtrTAn0PIfMpj5CueYrLO+p6QB3ywnSIM/oedV7w/HnHZcUFgS8rju83H3BhkRp3vuJ/CAzq16ijrgdz1D2MvUedP6x5gcyOOn/xvzrqAgYcdT2go84PTPoCxWUmF131kWMuaPluKk+4aKAddR6ghsjCW8jy+VD5Ukhgd1sI7GTQfF4eoneyyNwpbLmjVhoWFtCwEFDDIiSOGlm/ilpec9ScFBWoOcWEnF8xQUftaYG+h5D5FC2ka7QBR10X6KhjYDoEgyYddQx4/rwjtrggcKyAoy5uuaNW4y5O7qjrwhx1Wg8fXBFHXSKsecnMjrqEj6MuacBR1wU66hLApC9ZXGZy0VUfOeZSlu+mosNFA+2oo4EaIgtvacvnQ+VLaYHdLXDcIo7ay0P0ThaZO2Usd9RKwzICGpYGaliWxFEj61c5y2uOmpNyAjWnvJDzKy/oqD0t0PcQMp8qCOlawYCjrgN01BVhOqQbfY+6Inj+vKNScUHgSgKO+nLLHbUa9+XkjroOzFE7xt6jrhzW/IrMjrqyj6O+woCjrgN01JWBSX9FcZnJRVd95JivtHw3VSFcNNCOugJQQ2Thvcry+VD5cpXA7hY4bhFH7eUheieLzJ0qljtqpWEVAQ2vAmp4NYmjRtavayyvOWpOrhGoOdcKOb9rBR21pwX6HkLmU1UhXasacNS1gY66GkyHeKOOuhp4/ryjenFB4OoCjrqG5Y5ajbsGuaOuDXPUqcYcdc2w5oHMjrqmj6MOGHDUtYGOuiYw6QPFZSYXXfWRY3Ys301VDRcNtKOuCtQQWXjjLJ8PlS9xArtb4LhFHLWXh+idLDJ3gpY7aqVhUEDDOKCG8SSOGlm/EiyvOWpOEgRqTqKQ80sUdNSeFuh7CJlPSUK6Jhlw1LWAjjoE0yEp2aSjDoHnzzuSiwsCJws46lqWO2o17lrkjroW7hFzST64Io66dljzOpkddW0fR13HgKOuBXTUtYFJX6e4zOTCf48KHHNdy3dTSeGigXbUSUANkYW3nuXzofKlnsDuFjhuEUft5SF6J4vMnfqWO2qlYX0BDesBNWxA4qiR9auh5TVHzUlDgZrTSMj5NRJ01J4W6HsImU+NhXRtbMBRJwMddRPcOzRGHXUT8Px5R9PigsBNBRx1M8sdtRp3M3JHnQxz1PHGHHXzsOYtMjvq5j6OuoUBR50MdNTNgUnforjM5KKrPnLMLS3fTTUOFw20o24M1BBZeFtZPh8qX1oJ7G6B4xZx1F4eoneyyNxpbbmjVhq2FtCwFVDDNiSOGlm/2lpec9SctBWoOe2EnF87QUftaYG+h5D51F5I1/YGHHUI6Kivw71HHTDpqK8Dz593XF9cEPh6AUd9g+WOWo37BnJHHYI56uSAD66Io+4Q1vzGzI66g4+jvtGAow4BHXUHYNLfWFxmctFVHznmmyzfTbUPFw20o24P1BBZeG+2fD5UvtwssLsFjlvEUXt5iN7JInOno+WOWmnYUUDDm4Ea3kLiqJH161bLa46ak1sFas5tQs7vNkFH7WmBvoeQ+dRJSNdOBhx1EtBRd8btJx2TjrozeP68o0txQeAuAo66q+WOWo27K7mjToI56sQMH1wRR90trHn3zI66m4+j7m7AUScBHXU3YNJ3Ly4zueiqjxxziuW7qU7hooF21J2AGiILb6rl86HyJVVgdwsct4ij9vIQvZNF5k6a5Y5aaZgmoGEqUMMeJI4aWb/SLa85ak7SBWpOhpDzyxB01J4W6HsImU89hXTtacBRJwId9e24zzwafXrW7eD58447igsC3yHgqO+03FGrcd9J7qgTcd9MZuzpWb3Cmt+V2VH38nHUdxlw1IlAR90LmPR3FZeZXHTVR475bst3Uz3DRQPtqHsCNUQW3nssnw+VL/cI7G6B4xZx1F4eoneyyNzpbbmjVhr2FtDwHqCG95I4amT9us/ymqPm5D6BmnO/kPO7X9BRe1qg7yFkPvUR0rWPAUedAHTUfWE6pBt9j7oveP68o19xQeB+Ao66v+WOWo27P7mjTsA9PcvYe9QDwpoPzOyoB/g46oEGHHUC0FEPACb9wOIyk4uu+sgxD7J8N9UnXDTQjroPUENk4R1s+XyofBkssLsFjlvEUXt5iN7JInNniOWOWmk4REDDwUANHyBx1Mj69aDlNUfNyYMCNechIef3kKCj9rRA30PIfBoqpOtQA446HuioH4bpkJFg0lE/DJ4/73ikuCDwIwKO+lHLHbUa96Pkjjoe5qgDqT64Io56WFjzxzI76mE+jvoxA446HuiohwGT/rHiMpOLrvrIMT9u+W5qaLhooB31UKCGyML7hOXzofLlCYHdLXDcIo7ay0P0ThaZO8Mtd9RKw+ECGj4B1PBJEkeNrF9PWV5z1Jw8JVBznhZyfk8LOmpPC/Q9hMynEUK6jjDgqINARz0SpkOy0U99jwTPn3eMKi4IPErAUY+23FGrcY8md9RB3N9RG/vU95iw5mMzO+oxPo56rAFHHQQ66jHApB9bXGZy0VUfOeZxlu+mRoSLBtpRjwBqiCy84y2fD5Uv4wV2t8BxizhqLw/RO1lk7kyw3FErDScIaDgeqOEzJI4aWb+etbzmqDl5VqDmPCfk/J4TdNSeFuh7CJlPE4V0nWjAUccBHfXzuPeojX7X9/Pg+fOOF4oLAr8g4KhftNxRq3G/SO6o43Cf+jb2Xd+Twpq/lNlRT/Jx1C8ZcNRxQEc9CZj0LxWXmVx01UeO+WXLd1MTw0UD7agnAjVEFt5XLJ8PlS+vCOxugeMWcdReHqJ3ssjcmWy5o1YaThbQ8BWghlNIHDWyfk21vOaoOZkqUHOmCTm/aYKO2tMCfQ8h82m6kK7Tw7qadJdOLHYs3jGjuCDwDAF3OdNyd6nGPVPAXfqxIm6QmQI3MfDGE59vWzVEjnsWyWZiOnDMsy3fTKixzhLYTMyxfPOt5mWOcM25VA3nCm0c5v4/2DgEhDYO84oLAs8T2DjMt3zjoMY9n2TjoBJ5vsBNDLzxxOfbVg2R415AsnGYCxzzQss3DmqsCwQ2Doss3zioeVkkXHMuVcPFQhuHxQbew68JfA9/CfAeMrlZWlJcZrO0tLgg8FKBzdIyyzdLatzLDG2WApd2OIvDrOi3DhcD5wg538stX0BVoVsusICusHwBVWNeITDulUKL3kqfj4CgNZGeM8Q9vkxg04O831dZnvdKw1UCGi4HariaxGgh15w1lq8Tak7WCNTLtUL1cq3g270X0yJwaYeDzKecYS1yRGjwiZ9riJK517L6RfcbShDqN1Gm3/h4mX6Tk2T6TQwK9Zsm02+GkA4JQnmWki7Tb1KqTL89hHgDQnmWESfTb6JQnqVJ6evI9JsidF/ECa0XySGZfh2hehYnNG9pUnVdSN+4FJl+UzJk+g0J1Z0UoX1J8L95ht6/b8qO30OiGTcSMG4gYFxPwLiOgHEtAeMaAsbVBIyrCBhXEjCuIGBcTsC4jIBxKQHjEgLGxQSMiwgYFxIwLiBgnE/AOI+AcS4B4xwCxtkEjLMIGGcSMM4gYJxOwDiNgHEqAeMUAsbJAoxRWMasfrP6zeo3q9+sfrP6zeo3q9+sfrP6tbFfsfffW+W030e0JGBsQcDYnICxGQFjUwLGJgSMjQkYGxEwNiRgbEDAWJ+AsR4BY10CxjoEjLUJGGsRMCYTMIYIGJMIGBMJGBMIGOMJGIMEjHEEjA4BY4CAsSYBYw0CxuoEjNUIGKsSMB7KZT/jQQLGAwSM+wkY9xEw7iVg3EPAuJuA8R0CxrcJGN8iYNxFwPgmAeMbBIyvEzDuJGDcQcD4GgHjqwSM2wkYtxEwbiVg3ELAuJmAcRMB40YCxg0EjOsJGNcRMK4lYFxDwLiagDE1j/2MKQSM3QkYuxEwdiVg7ELA2JmAsRMB420EjLcSMN5CwNiRgPFmAsabCBhvJGDsQMB4AwHj9QSM1xEwtidgbEfA2JaAsQ0BY2sCxlYEjC0JGFsQMDYnYGxGwNiUgLEJAWNjAsazee1nPEPAeJqA8RQB40kCxhMEjMcJGI8RMH5JwPgFAePnBIxHCRg/I2D8lIDxEwLGIwSMHxMwfkTA+CEB42ECxg8IGN8nYHyPgPFdAsZDBIwHCRgPEDDuJ2DcR8C4l4BxDwHjbgLGwfnsZxxEwDiQgHEAAWN/AsZ+BIx9CRj7EDDeT8B4HwHjvQSMvQkY7yFgvJuA8S4Cxl4EjHcSMN5BwHg7AWNPAsYMAsZ0AsYeBIxpBIypBIwpBIzdCRi7ETB2JWDsQsDYmYCxEwFj7gL2M+YiYMxJwJiDgDE7AWM2AsYoAsYL+e1n/J2A8TcCxl8JGH8hYPyZgPEnAsYfCRh/IGD8noDxOwLGbwkYzxMwfkPA+DUB41cEjOcIGM8SMJ4hYDxNwHiKgPEkAeMJAsbjBIzHCBjHF7SfcRwB41gCxjEEjKMJGEcRMI4kYBxBwPg0AeNTBIxPEjAOJ2B8goDxcQLGxwgYhxEwPkrA+AgB48MEjEMJGB8iYHyQgPEBAsYhBIyDCRgHETAOJGAcQMDYn4CxHwFjXwLGPgSM5Qvbz1iOgLEsAWMZAsbSBIylCBhLEjCWIGAsTsAYS8AYQ8AYTcBYjICxKAFjEQLGwgSMhQgYCxIwFiBgzE/AmI+A8TICxrwEjHkIGHMTMOYiYMxJwJiDgDE7AWM2AsYoAsYLhexnnFfEfsa5BIxzCBhnEzDOImCcScA4g4BxOgHjNALGqQSMUwgYJxMwvkLA+DIB40sEjJMIGF8kYHyBgPF5AsaJBIzPETA+S8D4DAHjBALG8QSM4wgYxxIwjiFgHE3AOIqAcSQB4wgCxsRi9jMmEDDGEzAGCRjjCBgdAsYAAWNNAsYaBIzVCRirETBWJWC8loDxGgLGqwkYqxAwXkXAeCUB4xUEjJUJGC8nYKxEwFiRgLECAWN5AsZyBIxlCRjLEDCWJmAsRcBYkoCxBAHjtmj7GbcSMG4hYNxMwLiJgHEjAeMGAsb1BIzrCBjXEjCuIWBcTcC4ioBxJQHjCgLG5QSMywgYlxIwLiFgXEzAuIiAcSEB4wICxvkEjPMIGOcSMM4hYJxNwDiLgHEmAeMMAsbpBIztYu1nbEvA2IaAsTUBYysCxpYEjC0IGJsTMDYjYGxKwNiEgLExAWMjAsaGBIwNCBjrEzDWI2CsS8BYh4CxNgFjLQLGZALGEAFjEgFjIgFjAgFjPAFjkIAxjoDRIWAMEDDWFGCMPCB9O+lyfbtH9ghti4Rfry8eFbXBbRvdtsltm922xW1b3bbNbdvd9qrbXnPbDrftdNvrbnvDbW8W/08fu4qHO80R/lddVDHTuVd9zr3mc26Hz7mdPude9zn3hs+5N33O7QqfizzgHygrLpNw8A/nRXAGA4nx8elJcelO0EkJxCWnhhIC8QmpiSEn5CSEEnrEhYLB9FB8KCk5NTkpkOzEB9OdjITkYGKKeyY1MUWScyOAM5SWHAyEUtIkOTcBOOOdUHyck5Euybn50jnjMnokh4Jxsvm5BaFnSo+MxKT0BEnOrQDOtPRgWnJSjyRJzm0IPQNJPRKSe/xp3nOAOTdmRy2qgcCm7Jc+5oxwd28B63rkmvSWz5qUHamp82f2S9XhbSEd3vbRAZ1bG7Lj+nobqOk7Qpq+YyC33gHqsFtIh90Gcms9MLd2AzXdI6TpHunccnXYbqkOknm0Frj+rQOuf3uF8mivgRq1F5hH+4R02GegRq0B1qh9QE33C2m630Bu7QfqcEBIhwMGcms1MLcOADU9KKTpQQPr36uW6iCZRyuB698q4Pp3SCiPDhmoUYeAefSukA7vGqhRK4A16l2gpu8Jafqegdx6D6jD+0I6vG8gt5YDc+t9oKYfCGn6gYH17zVLdZDMo6XA9W8ZcP07LJRHhw3UqMPAPPpQSIcPDdSoJcAa9SFQ04+ENP3IQG59BNThYyEdPjaQW4uBufUxUNMjQpoeMbD+7bBUB8k8Wghc/xYB179PhPLoEwM16hNgHn0qpMOnBmrUAmCN+hSo6WdCmn5mILc+A+pwVEiHowZyaz4wt44CNf1cSNPPDax/Oy3VQTKP5gLXv3nA9e8LoTz6wkCN+gKYR18K6fClgRo1B1ijvgRqekxI02MGcusYUIfjQjocN5Bbs4G5dRyo6QkhTU8YWP9et1QHyTyaCVz/ZgHXv5NCeXTSQI06CcyjU0I6nDJQo2YAa9QpoKanhTQ9bSC3TgN1OCOkwxkDuTUdmFtngJqeFdL0rIH17w1LdZDMo6nA9W8acP07J5RH5wzUqHPAPPpKSIevDNSoKcAa9RVQ06+FNP3aQG59DdThGyEdvjGQW5OBufUNUNPzQpqeN7D+vWmpDpFjzvx3ipfK+S0J53cAzlBCyIVITpLk/B7AmRhMTMtISkiQ5PwBwJmSnpTaIz0QlOT8EcCZEZeYlJYecCQ5f0LomRAXSA45aZKcPwM445y0YGIoLkWS8xeEnhkuZGJQdN5/RdzvKYHk9MRE0br0G4AzNTUxKSU9JFqXfgdwBtMS0zOCSXGSnBcg93t8RkZCUPQ+iipx6ZwJTiA9IS4pQ5IzG4AzOTWQkBgKidbP7ABOJyMU7JGckirJmQMx76npgbQeTrJiiwkzflv8j+/5+S7i9fcRr3+IeP1jxOufIl7/HPH6l4jXkd9pFPldRpHfYRT53UWR31kU+V1Fkd9RFPndRL9GvP4t4vXvEa8vRLxW94/3OlvE6+wRr3OEX+d0/83lttxuy+O2vG67zG353JbfbTmj/uNnckTM+SfZonyPBpc4d96R1a9kv39eC4H9Jsr0Gx8v0++fPRWu38SgUL9pMv1mCOmQIJRnKeky/SalyvTbQ4g3IJRnGXEy/SYK5VmalL6OTL8pQvdFnNB6kRyS6dcRqmdxQvOWJlXXhfT98+86cP2mZMj0GxKqOylC+5I/fkeTDdpvwIn8TrrAJR5SjBsJGDcQMK4nYFxHwLiWgHENAeNqAsZVBIwrCRhXEDAuJ2BcRsC4lIBxCQHjYgLGRQSMCwkYFxAwzidgnEfAOJeAcQ4B42wCxlkEjDMJGGcQME4nYJxGwDiVgHEKAeNkAcYoLGNWv1n9ZvWb1W9Wv1n9ZvWb1W9Wv1n92tiv2PvvrXLa7yNaEjC2IGBsTsDYjICxKQFjEwLGxgSMjQgYGxIwNiBgrE/AWI+AsS4BYx0CxtoEjLUIGJMJGEMEjEkEjIkEjAkEjPEEjEECxjgCRoeAMUDAWJOAsQYBY3UCxmoEjFUJGA/lsp/xIAHjAQLG/QSM+wgY9xIw7iFg3E3A+A4B49sEjG8RMO4iYHyTgPENAsbXCRh3EjDuIGB8jYDxVQLG7QSM2wgYtxIwbiFg3EzAuImAcSMB4wYCxvUEjOsIGNcSMK4hYFxNwJiax37GFALG7gSM3QgYuxIwdiFg7EzA2ImA8TYCxlsJGG8hYOxIwHgzAeNNBIw3EjB2IGC8gYDxegLG6wgY2xMwtiNgbEvA2IaAsTUBYysCxpYEjC0IGJsTMDYjYGxKwNiEgLExAePZvPYzniFgPE3AeIqA8SQB4wkCxuMEjMcIGL8kYPyCgPFzAsajBIyfETB+SsD4CQHjEQLGjwkYPyJg/JCA8TAB4wcEjO8TML5HwPguAeMhAsaDBIwHCBj3EzDuI2DcS8C4h4BxNwHj4Hz2Mw4iYBxIwDiAgLE/AWM/Asa+BIx9CBjvJ2C8j4DxXgLG3gSM9xAw3k3AeBcBYy8CxjsJGO8gYLydgLEnAWMGAWM6AWMPAsY0AsZUAsYUAsbuBIzdCBi7EjB2IWDsTMDYiYAxdwH7GXMRMOYkYMxBwJidgDEbAWMUAeOF/PYz/k7A+BsB468EjL8QMP5MwPgTAeOPBIw/EDB+T8D4HQHjtwSM5wkYvyFg/JqA8SsCxnMEjGcJGM8QMJ4mYDxFwHiSgPEEAeNxAsZjBIzjC9rPOI6AcSwB4xgCxtEEjKMIGEcSMI4gYHyagPEpAsYnCRiHEzA+QcD4OAHjYwSMwwgYHyVgfISA8WECxqEEjA8RMD5IwPgAAeMQAsbBBIyDCBgHEjAOIGDsT8DYj4CxLwFjHwLG8oXtZyxHwFiWgLEMAWNpAsZSBIwlCRhLEDAWJ2CMJWCMIWCMJmAsRsBYlICxCAFjYQLGQgSMBQkYCxAw5idgzEfAeBkBY14CxjwEjLkJGHMRMOYkYMxBwJidgDEbAWMUAeOFQvYzzitiP+NcAsY5BIyzCRhnETDOJGCcQcA4nYBxGgHjVALGKQSMkwkYXyFgfJmA8SUCxkkEjC8SML5AwPg8AeNEAsbnCBifJWB8hoBxAgHjeALGcQSMYwkYxxAwjiZgHEXAOJKAcQQBY2Ix+xkTCBjjCRiDBIxxBIwOAWOAgLEmAWMNAsbqBIzVCBirEjBeS8B4DQHj1QSMVQgYryJgvJKA8QoCxsoEjJcTMFYiYKxIwFiBgLE8AWM5AsayBIxlCBhLEzCWImAsScBYgoBxW7T9jFsJGLcQMG4mYNxEwLiRgHEDAeN6AsZ1BIxrCRjXEDCuJmBcRcC4koBxBQHjcgLGZQSMSwkYlxAwLiZgXETAuJCAcQEB43wCxnkEjHMJGOcQMM4mYJxFwDiTgHEGAeN0AsZ2sfYztiVgbEPA2JqAsRUBY0sCxhYEjM0JGJsRMDYlYGxCwNiYgLERAWNDAsYGBIz1CRjrETDWJWCsQ8BYm4CxFgFjMgFjiIAxiYAxkYAxgYAxnoAxSMAYR8DoEDAGCBhrCjBGHpC+nXS5vgPxgewR2hYJvy5QIiqqoNsKua2w24q4rajbirkt2m0xbot1W3G3lXBbSbeVcltpt5Up8Z8+ypYId5oj/K+6qGKmc7E+54r7nCvhc66kz7lSPudK+5wr43OubPhc5IFOOCUsqK+AJGdBEs5CJJyFSTiLkHAWJeEsRsIZHcEZDCTGx6cnxaU7QSclEJecGkoIxCekJoackJMQSugRFwoG00PxoaTk1OSkQLITH0x3MhKSgxk+nDnAnC1zohbVQKBVTtyYywHnOXJNKuezJmVHaur8mf1SdSgvpEN5Hx3QudUiJ66v8kBNKwhpWsFAblUA6lBRSIeKBnKrOTC3KgI1rSSkaSXp3HJ1iLFUB8k8agpc/5oB17/LhfLocgM16nJgHlUW0qGygRrVBFijKgM1vUJI0ysM5NYVQB2uFNLhSgO51RiYW1cCNb1KSNOrDKx/sZbqIJlHDYHrXyPg+ldFKI+qGKhRVYB5dLWQDlcbqFENgDXqaqCm1whpeo2B3LoGqMO1QjpcayC36gNz61qgplWFNK1qYP0rbqkOknlUF7j+1QOuf9WE8qiagRpVDZhH1YV0qG6gRtUB1qjqQE1rCGlaw0Bu1QDqUFNIh5oGcqs2MLdqAjUNCGkaMLD+lbBUB8k8Sgauf7WA658jlEeOgRrlAPMoTkiHOAM1KgSsUXFATYNCmgYN5FYQqEO8kA7xBnIrCZhb8UBNE4Q0TTCw/pW0VAfJPEoArn+JwPUvUSiPEg3UqERgHiUJ6ZBkoEbFA2tUElDTkJCmIQO5FQLqkCykQ7KB3AoCcysZqGktIU1rGVj/Slmqg2QeOcD1Lw64/tUWyqPaBmpUbWAe1RHSoY6BGhUA1qg6QE3rCmla10Bu1QXqUE9Ih3oGcqsmMLfqATWtL6RpfQPrX2lLdZDMo+rA9a8GcP1rIJRHDQzUqAbAPGoopENDAzWqGrBGNQRq2khI00YGcqsRUIfGQjo0NpBbVYG51RioaRMhTZsYWP/KWKpD5Jgz/53ipXI2xXE6ii0mzPht8T/+Hhz1ummJP15H/u175N+8R/6te+TfuEf+bXvk37RH/i175N+w54x4nSvide6I13kiXueNeH1ZxOt8Ea/zh183c/9t7rYWbmvptlZua+22Nm5r6zb31v6/vM8RMeefZIvyPRpg5i6Q1a9kv6EEoX4TZfqNj5fpNzlJpt/EoFC/aTL9ZgjpkCCUZynpMv0mpcr020OINyCUZxlxMv0mCuVZmpS+jky/KUL3RZzQepEckunXEapncULzliZV14X0jUuR6TclQ6bfkFDdSRHalwT/m2fZoP0GnE3Z8XtINONGAsYNBIzrCRjXETCuJWBcQ8C4moBxFQHjSgLGFQSMywkYlxEwLiVgXELAuJiAcREB40ICxgUEjPMJGOcRMM4lYJxDwDibgHEWAeNMAsYZBIzTCRinETBOJWCcQsA4WYAxCsuY1W9Wv1n9ZvWb1W9Wv1n9ZvWb1W9Wvzb2K/b+e6uc+LGjGVsSMLYgYGxOwNiMgLEpAWMTAsbGBIyNCBgbEjA2IGCsT8BYj4CxLgFjHQLG2gSMtQgYkwkYQwSMSQSMiQSMCQSM8QSMQQLGOAJGh4AxQMBYk4CxBgFjdQLGagSMVQkYD+Wyn/EgAeMBAsb9BIz7CBj3EjDuIWDcTcD4DgHj2wSMbxEw7iJgfJOA8Q0CxtcJGHcSMO4gYHyNgPFVAsbtBIzbCBi3EjBuIWDcTMC4iYBxIwHjBgLG9QSM6wgY1xIwriFgXE3AmJrHfsYUAsbuBIzdCBi7EjB2IWDsTMDYiYDxNgLGWwkYbyFg7EjAeDMB400EjDcSMHYgYLyBgPF6AsbrCBjbEzC2I2BsS8DYhoCxNQFjKwLGlgSMLQgYmxMwNiNgbErA2ISAsTEB49m89jOeIWA8TcB4ioDxJAHjCQLG4wSMxwgYvyRg/IKA8XMCxqMEjJ8RMH5KwPgJAeMRAsaPCRg/ImD8kIDxMAHjBwSM7xMwvkfA+C4B4yECxoMEjAcIGPcTMO4jYNxLwLiHgHE3AePgfPYzDiJgHEjAOICAsT8BYz8Cxr4EjH0IGO8nYLyPgPFeAsbeBIz3EDDeTcB4FwFjLwLGOwkY7yBgvJ2AsScBYwYBYzoBYw8CxjQCxlQCxhQCxu4EjN0IGLsSMHYhYOxMwNiJgDF3AfsZcxEw5iRgzEHAmJ2AMRsBYxQB44X89jP+TsD4GwHjrwSMvxAw/kzA+BMB448EjD8QMH5PwPgdAeO3BIznCRi/IWD8moDxKwLGcwSMZwkYzxAwniZgPEXAeJKA8QQB43ECxmMEjOML2s84joBxLAHjGALG0QSMowgYRxIwjiBgfJqA8SkCxicJGIcTMD5BwPg4AeNjBIzDCBgfJWB8hIDxYQLGoQSMDxEwPkjA+AAB4xACxsEEjIMIGAcSMA4gYOxPwNiPgLEvAWMfAsbyhe1nLEfAWJaAsQwBY2kCxlIEjCUJGEsQMBYnYIwlYIwhYIwmYCxGwFiUgLEIAWNhAsZCBIwFCRgLEDDmJ2DMR8B4GQFjXgLGPASMuQkYcxEw5iRgzEHAmJ2AMRsBYxQB44VC9jPOK2I/41wCxjkEjLMJGGcRMM4kYJxBwDidgHEaAeNUAsYpBIyTCRhfIWB8mYDxJQLGSQSMLxIwvkDA+DwB40QCxucIGJ8lYHyGgHECAeN4AsZxBIxjCRjHEDCOJmAcRcA4koBxBAFjYjH7GRMIGOMJGIMEjHEEjA4BY4CAsSYBYw0CxuoEjNUIGKsSMF5LwHgNAePVBIxVCBivImC8koDxCgLGygSMlxMwViJgrEjAWIGAsTwBYzkCxrIEjGUIGEsTMJYiYCxJwFiCgHFbtP2MWwkYtxAwbiZg3ETAuJGAcQMB43oCxnUEjGsJGNcQMK4mYFxFwLiSgHEFAeNyAsZlBIxLCRiXEDAuJmBcRMC4kIBxAQHjfALGeQSMcwkY5xAwziZgnEXAOJOAcQYB43QCxnax9jO2JWBsQ8DYmoCxFQFjSwLGFgSMzQkYmxEwNiVgbELA2JiAsREBY0MCxgYEjPUJGOsRMNYlYKxDwFibgLEWAWMyAWOIgDGJgDGRgDGBgDGegDFIwBhHwOgQMAYIGGsKMEYekL6ddLm+A6FA9ghti4RftysRFdXebde57Xq33eC2Dm670W03ue1mt3V02y1uu9Vtt7mtk9s6u61Lif/00bVEuNMc4X9VpxUznWvvc+46n3PX+5y7wedcB59zN/qcu8nn3M0+5zr6nLvF59ytPudu8znXyedcZ59zXXzOdQ2fizxyQJMh4BzMhUraQOBQRF/BQGJ8fHpSXLoTdFICccmpoYRAfEJqYsgJOQmhhB5xoWAwPRQfSkpOTU4KJDvxwXQnIyE5mBHurlsJ3I0aqWk3H02zIzV1/sx+qTp0F9Khu4HcOpAL11d3oKYpQpqmGMitFKAOqUI6pBrIrf3A3EoFapompGmadG6pNz4t1UEyj/YC1799wPWvh1Ae9TBQo3oA8yhdSId0AzVqD7BGpQM1zRDSNMNAbmUAdegppENPA7m1G5hbPYGa3i6k6e0G1r/2luogmUdvA9e/d4Dr3x1CeXSHgRp1BzCP7hTS4U4DNeotYI26E6hpLyFNexnIrV5AHe4S0uEuA7m1C5hbdwE1vVtI07sNrH/XWaqDZB69AVz/3gSuf/cI5dE9BmrUPcA86i2kQ28DNep1YI3qDdT0XiFN7zWQW/cCdbhPSIf7DOTWTmBu3QfU9H4hTe83sP5db6kOknn0GnD92wFc//oI5VEfAzWqDzCP+grp0NdAjXoVWKP6AjXtJ6RpPwO51Q+oQ38hHfobyK3twNzqD9R0gJCmAwysfzdYqoNkHm0Frn/bgOvfQKE8GmigRg0E5tEgIR0GGahRW4A1ahBQ08FCmg42kFuDgToMEdJhiIHc2gzMrSFATR8Q0vQBA+tfB0t1kMyjjcD1bxNw/XtQKI8eNFCjHgTm0UNCOjxkoEZtANaoh4CaDhXSdKiB3BoK1OFhIR0eNpBb64G59TBQ00eENH3EwPp3o6U6SObRWuD6tw64/j0qlEePGqhRjwLzaJiQDsMM1Kg1wBo1DKjpY0KaPmYgtx4D6vC4kA6PG8it1cDcehyo6RNCmj5hYP27yVIdJPMoJQ/u3kzNg9NvuFAeDTdQo4YD8+hJIR2eNFCjuufB9fUkUNOnhDR9ykBuPQXU4WkhHZ42kFvdgLn1NFDTEUKajjCw/t1sqQ6SedQFuP51Ba5/I4XyaKSBGjUSmEejhHQYZaBGdQbWqFFATUcLaTraQG6NBuowRkiHMQZyqxMwt8YANR0rpOlYA+tfR0t1kMyjW4Hr323A9W+cUB6NM1CjxgHzaLyQDuMN1KhbgDVqPFDTCUKaTjCQWxOAOjwjpMMzBnKrIzC3ngFq+qyQps8aWP9usVQHyTy6Cbj+3Qxc/54TyqPnDNSo54B5NFFIh4kGatSNwBo1Eajp80KaPm8gt54H6vCCkA4vGMitDsDcegGo6YtCmr5oYP271VIdJPPoeuD6dwNw/ZsklEeTDNSoScA8eklIh5cM1KjrgDXqJaCmLwtp+rKB3HoZqMMrQjq8YiC32gNz6xWgppOFNJ1sYP27zVIdJPOoLXD9awdc/6YI5dEUAzVqCjCPpgrpMNVAjWoDrFFTgZpOE9J0moHcmgbUYbqQDtMN5FZrYG5NB2o6Q0jTGQbWv06W6iCZRy2B618r4Po3UyiPZhqoUTOBeTRLSIdZBmpUC2CNmgXUdLaQprMN5NZsoA5zhHSYYyC3mgNzaw5Q07lCms41sP51tlQHyTxqClz/mgHXv3lCeTTPQI2aB8yj+UI6zDdQo5oAa9R8oKYLhDRdYCC3FgB1WCikw0IDudUYmFsLgZouEtJ0kYH1r4vFOsRE/fWZipHPUox8hmLksxMjn5kY+azEyGckRj4bMfKZiJHPQox8BmLksw8jn3kY+azDyGccRj7bsFnE6+YRr1tEvG4Z8bpVxOvWEa/bRLxuG3692P13iduWum2Z25a7bYXbVrptldtyhvPJuxfVtZ9ki/I9GoDmLqtfyX5DCUL9Jsr0Gx8v029ykky/iUGhftNk+s0Q0iFBKM9S0mX6TUqV6beHEG9AKM8y4mT6TRTKszQpfR2ZflOE7os4ofUiOSTTryNUz+KE5i1Nqq4L6RuXItNvSoZMvyGhupMitC8J/jfPskH7DTibsuP3kGjGjQSMGwgY1xMwriNgXEvAuIaAcTUB4yoCxpUEjCsIGJcTMC4jYFxKwLiEgHExAeMiAsaFBIwLCBjnEzDOI2CcS8A4h4BxNgHjLALGmQSMMwgYpxMwTiNgnErAOIWAcbIAYxSWMavfrH6z+s3qN6vfrH6z+s3qN6vfrH5t7Ffs/fdWOe33ES0JGFsQMDYnYGxGwNiUgLEJAWNjAsZGBIwNCRgbEDDWJ2CsR8BYl4CxDgFjbQLGWgSMyQSMIQLGJALGRALGBALGeALGIAFjHAGjQ8AYIGCsScBYg4CxOgFjNQLGqgSMh3LZz3iQgPEAAeN+AsZ9BIx7CRj3EDDuJmB8h4DxbQLGtwgYdxEwvknA+AYB4+sEjDsJGHcQML5GwPgqAeN2AsZtBIxbCRi3EDBuJmDcRMC4kYBxAwHjegLGdQSMawkY1xAwriZgTM1jP2MKAWN3AsZuBIxdCRi7EDB2JmDsRMB4GwHjrQSMtxAwdiRgvJmA8SYCxhsJGDsQMN5AwHg9AeN1BIztCRjbETC2JWBsQ8DYmoCxFQFjSwLGFgSMzQkYmxEwNiVgbELA2JiA8Wxe+xnPEDCeJmA8RcB4koDxBAHjcQLGYwSMXxIwfkHA+DkB41ECxs8IGD8lYPyEgPEIAePHBIwfETB+SMB4mIDxAwLG9wkY3yNgfJeA8RAB40ECxgMEjPsJGPcRMO4lYNxDwLibgHFwPvsZBxEwDiRgHEDA2J+AsR8BY18Cxj4EjPcTMN5HwHgvAWNvAsZ7CBjvJmC8i4CxFwHjnQSMdxAw3k7A2JOAMYOAMZ2AsQcBYxoBYyoBYwoBY3cCxm4EjF0JGLsQMHYmYOxEwJi7gP2MuQgYcxIw5iBgzE7AmI2AMYqA8UJ++xl/J2D8jYDxVwLGXwgYfyZg/ImA8UcCxh8IGL8nYPyOgPFbAsbzBIzfEDB+TcD4FQHjOQLGswSMZwgYTxMwniJgPEnAeIKA8TgB4zECxvEF7WccR8A4loBxDAHjaALGUQSMIwkYRxAwPk3A+BQB45MEjMMJGJ8gYHycgPExAsZhBIyPEjA+QsD4MAHjUALGhwgYHyRgfICAcQgB42ACxkEEjAMJGAcQMPYnYOxHwNiXgLEPAWP5wvYzliNgLEvAWIaAsTQBYykCxpIEjCUIGIsTMMYSMMYQMEYTMBYjYCxKwFiEgLEwAWMhAsaCBIwFCBjzEzDmI2C8jIAxLwFjHgLG3ASMuQgYcxIw5iBgzE7AmI2AMYqA8UIh+xnnFbGfcS4B4xwCxtkEjLMIGGcSMM4gYJxOwDiNgHEqAeMUAsbJBIyvEDC+TMD4EgHjJALGFwkYXyBgfJ6AcSIB43MEjM8SMD5DwDiBgHE8AeM4AsaxBIxjCBhHEzCOImAcScA4goAxsZj9jAkEjPEEjEECxjgCRoeAMUDAWJOAsQYBY3UCxmoEjFUJGK8lYLyGgPFqAsYqBIxXETBeScB4BQFjZQLGywkYKxEwViRgrEDAWJ6AsRwBY1kCxjIEjKUJGEsRMJYkYCxBwLgt2n7GrQSMWwgYNxMwbiJg3EjAuIGAcT0B4zoCxrUEjGsIGFcTMK4iYFxJwLiCgHE5AeMyAsalBIxLCBgXEzAuImBcSMC4gIBxPgHjPALGuQSMcwgYZxMwziJgnEnAOIOAcToBY7tY+xnbEjC2IWBsTcDYioCxJQFjCwLG5gSMzQgYmxIwNiFgbEzA2IiAsSEBYwMCxvoEjPUIGOsSMNYhYKxNwFiLgDGZgDFEwJhEwJhIwJhAwBhPwBgkYIwjYHQIGAMEjDUFGCMPSN9OulzfgbRA9ghti4Rfry4RFbXGbWvdts5t6922wW0b3bbJbZvdtsVtW922zW3b3faq215z244S/+ljZ4lwpznC/6pOK2Y6t8bn3Fqfc+t8zq33ObfB59xGn3ObfM5t9jm3xefcVp9z23zObfc596rPudd8zu3wObczfC7yyAFNhoBzJi8qaQOBsxF9BQOJ8fHpSXHpTtBJCcQlp4YSAvEJqYkhJ+QkhBJ6xIWCwfRQfCgpOTU5KZDsxAfTnYyE5GBGuLvXS+Bu1EhNX/fRNDtSU+fP7JeqwxtCOrxhILdO58X19QZQ0zeFNH3TQG69CdRhl5AOuwzk1ilgbu0CavqWkKZvSeeW+rCppTpI5tEJ4Pp3Erj+vS2UR28bqFFvA/PoHSEd3jFQo44Da9Q7QE13C2m620Bu7QbqsEdIhz0GcusYMLf2ADXdK6TpXgPr3xpLdZDMoy+A69+XwPVvn1Ae7TNQo/YB82i/kA77DdSoz4E1aj9Q0wNCmh4wkFsHgDocFNLhoIHcOgrMrYNATQ8JaXrIwPq31lIdJPPoU+D69xlw/XtXKI/eNVCj3gXm0XtCOrxnoEZ9AqxR7wE1fV9I0/cN5Nb7QB0+ENLhAwO5dQSYWx8ANT0spOlhA+vfOkt1kMyjj4Dr38fA9e9DoTz60ECN+hCYRx8J6fCRgRr1IbBGfQTU9GMhTT82kFsfA3U4IqTDEQO5dRiYW0eAmn4ipOknBta/9ZbqIJlH7wPXvw+A69+nQnn0qYEa9Skwjz4T0uEzAzXqPWCN+gyo6VEhTY8ayK2jQB0+F9LhcwO59S4wtz4HavqFkKZfGFj/Nliqg2QeHQSuf4eA69+XQnn0pYEa9SUwj44J6XDMQI06AKxRx4CaHhfS9LiB3DoO1OGEkA4nDOTWfmBunQBqelJI05MG1r+NluogmUd7gevfPuD6d0ooj04ZqFGngHl0WkiH0wZq1B5gjToN1PSMkKZnDOTWGaAOZ4V0OGsgt3YDc+ssUNNzQpqeM7D+bbJUB8k8GpQPd28OzofT7yuhPPrKQI36CphHXwvp8LWBGjUwH66vr4GafiOk6TcGcusboA7nhXQ4byC3BgBz6zxQ02+FNP3WwPq32VIdJPOoH3D96w9c/74TyqPvDNSo74B59L2QDt8bqFF9gTXqe6CmPwhp+oOB3PoBqMOPQjr8aCC3+gBz60egpj8JafqTgfVvi6U6SObRfcD1737g+vezUB79bKBG/QzMo1+EdPjFQI26F1ijfgFq+quQpr8ayK1fgTr8JqTDbwZyqzcwt34Davq7kKa/G1j/tlqqg2Qe3Q1c/+4Brn8XhPLogoEadQGYR1ElZXRQ/WbWAZ1bdwFrVKQOl6ppNiFNs5WUz61sQB2yC+mQ3UBu9QLmVnagpjmENM1RUn7921bCTh0k8+gO4Pp3J3D9yymURzkN1KicwPspl5AOuQzUqNuBNSoXUNPcQprmNpBbuYE65BHSIY+B3OoJzK08QE3zCmma18D6t72EnTpI5lE6cP3LAK5/lwnl0WUGatRlwPspn5AO+QzUqB7AGpUPqGl+IU3zG8it/EAdCgjpUMBAbqUBc6sAUNOCQpoWNLD+vVrCTh0k8ygFuP6lAte/QkJ5VMhAjSoEvJ8KC+lQ2ECN6g6sUYWBmhYR0rSIgdwqAtShqJAORQ3kVjdgbhUFalpMSNNiBta/10rYqYNkHnUBrn9dgetftFAeRRuoUdHA+ylGSIcYAzWqM7BGxQA1jRXSNNZAbsUCdSgupENxA7nVCZhbxYGalhDStISB9W9HCXt1iIn66zMVI5+lGPkMxchnJ0Y+MzHyWYmRz0iMfDZi5DMRI5+FGPkMxMhnH0Y+8zDyWYeRzziMfLbh4ojXSyJeL414vSzi9fKI1ysiXq+MeL0q/Lqkq3kpt5V2Wxm3lXVbObeVd1sFt+UM55N3L6prP8kW5Xs0AM1dVr+S/YYShPpNlOk3Pl6m3+QkmX4Tg0L9psn0myGkQ4JQnqWky/SblCrTbw8h3oBQnmXEyfSbKJRnaVL6OjL9pgjdF3FC60VySKZfR6iexQnNW5pUXRfSNy5Fpt+UDJl+Q0J1J0VoXxL8b55lg/YbcDZlx+8h0YwbCRg3EDCuJ2BcR8C4loBxDQHjagLGVQSMKwkYVxAwLidgXEbAuJSAcQkB42ICxkUEjAsJGBcQMM4nYJxHwDiXgHEOAeNsAsZZBIwzCRhnEDBOJ2CcRsA4lYBxCgHjZAHGKCxjVr9Z/Wb1m9VvVr9Z/Wb1m9VvVr9Z/drYr9j7761y2u8jWhIwtiBgbE7A2IyAsSkBYxMCxsYEjI0IGBsSMDYgYKxPwFiPgLEuAWMdAsbaBIy1CBiTCRhDBIxJBIyJBIwJBIzxBIxBAsY4AkaHgDFAwFiTgLEGAWN1AsZqBIxVCRgP5bKf8SAB4wECxv0EjPsIGPcSMO4hYNxNwPgOAePbBIxvETDuImB8k4DxDQLG1wkYdxIw7iBgfI2A8VUCxu0EjNsIGLcSMG4hYNxMwLiJgHEjAeMGAsb1BIzrCBjXEjCuIWBcTcCYmsd+xhQCxu4EjN0IGLsSMHYhYOxMwNiJgPE2AsZbCRhvIWDsSMB4MwHjTQSMNxIwdiBgvIGA8XoCxusIGNsTMLYjYGxLwNiGgLE1AWMrAsaWBIwtCBibEzA2I2BsSsDYhICxMQHj2bz2M54hYDxNwHiKgPEkAeMJAsbjBIzHCBi/JGD8goDxcwLGowSMnxEwfkrA+AkB4xECxo8JGD8iYPyQgPEwAeMHBIzvEzC+R8D4LgHjIQLGgwSMBwgY9xMw7iNg3EvAuIeAcTcB4+B89jMOImAcSMA4gICxPwFjPwLGvgSMfQgY7ydgvI+A8V4Cxt4EjPcQMN5NwHgXAWMvAsY7CRjvIGC8nYCxJwFjBgFjOgFjDwLGNALGVALGFALG7gSM3QgYuxIwdiFg7EzA2ImAMXcB+xlzETDmJGDMQcCYnYAxGwFjFAHjhfz2M/5OwPgbAeOvBIy/EDD+TMD4EwHjjwSMPxAwfk/A+B0B47cEjOcJGL8hYPyagPErAsZzBIxnCRjPEDCeJmA8RcB4koDxBAHjcQLGYwSM4wvazziOgHEsAeMYAsbRBIyjCBhHEjCOIGB8moDxKQLGJwkYhxMwPkHA+DgB42MEjMMIGB8lYHyEgPFhAsahBIwPETA+SMD4AAHjEALGwQSMgwgYBxIwDiBg7E/A2I+AsS8BYx8CxvKF7WcsR8BYloCxDAFjaQLGUgSMJQkYSxAwFidgjCVgjCFgjCZgLEbAWJSAsQgBY2ECxkIEjAUJGAsQMOYnYMxHwHgZAWNeAsY8BIy5CRhzETDmJGDMQcCYnYAxGwFjFAHjhUL2M84rYj/jXALGOQSMswkYZxEwziRgnEHAOJ2AcRoB41QCxikEjJMJGF8hYHyZgPElAsZJBIwvEjC+QMD4PAHjRALG5wgYnyVgfIaAcQIB43gCxnEEjGMJGMcQMI4mYBxFwDiSgHEEAWNiMfsZEwgY4wkYgwSMcQSMDgFjgICxJgFjDQLG6gSM1QgYqxIwXkvAeA0B49UEjFUIGK8iYLySgPEKAsbKBIyXEzBWImCsSMBYgYCxPAFjOQLGsgSMZQgYSxMwliJgLEnAWIKAcVu0/YxbCRi3EDBuJmDcRMC4kYBxAwHjegLGdQSMawkY1xAwriZgXEXAuJKAcQUB43ICxmUEjEsJGJcQMC4mYFxEwLiQgHEBAeN8AsZ5BIxzCRjnEDDOJmCcRcA4k4BxBgHjdALGdrH2M7YlYGxDwNiagLEVAWNLAsYWBIzNCRibETA2JWBsQsDYmICxEQFjQwLGBgSM9QkY6xEw1iVgrEPAWJuAsRYBYzIBY4iAMYmAMZGAMYGAMZ6AMUjAGEfA6BAwBggYawowRh6Qvp10wb4DgewR2hYJv65YMiqqktsud1tlt13htivddpXbqrjtardd47Zr3VbVbdXcVt1tNdxWs2SYq2S40xzhf1WnFTOdq+Rz7nKfc5V9zl3hc+5Kn3NX+Zyr4nPuap9z1/icu9bnXFWfc9V8zlX3OVfD51xNn3OB8LnIIwcyGdx0yFUAl1i5I/oKBhLj49OT4tKdoJMSiEtODSUE4hNSE0NOyEkIJfSICwWD6aH4UFJyanJSINmJD6Y7GQnJwQyvu5K4GzVSU8dH0+xITZ0/s1+qDnFCOsQZyK2cBYCLNFDToJCmQQO5FQTqEC+kQ7yB3MoBzK14oKYJQpomSOeW+gM/S3WQzKNswPUvO3D9SxTKo0QDNSoRmEdJQjokGahRUcAalQTUNCSkachAboWAOiQL6ZBsILcu5Af+8hWoaS0hTWsZWP8qWaqDZB79lh93b/6eH6dfbaE8qm2gRtUG5lEdIR3qGKhRvwJrVB2gpnWFNK1rILfqAnWoJ6RDPQO59Qswt+oBNa0vpGl9A+vf5ZbqIJlHPwHXv5+B618DoTxqYKBGNQDmUUMhHRoaqFE/AmtUQ6CmjYQ0bWQgtxoBdWgspENjA7n1AzC3GgM1bSKkaRMD619lS3WQzKPvgOvf98D1r6lQHjU1UKOaAvOomZAOzQzUqG+BNaoZUNPmQpo2N5BbzYE6tBDSoYWB3DoPzK0WQE1bCmna0sD6d4WlOkjm0dfA9e8b4PrXSiiPWhmoUa2AedRaSIfWBmrUV8Aa1RqoaRshTdsYyK02QB3aCunQ1kBunQPmVlugpu2ENG1nYP270lIdJPPoDHD9Owtc/9oL5VF7AzWqPTCPrhPS4ToDNeo0sEZdB9T0eiFNrzeQW9cDdbhBSIcbDOTWKWBu3QDUtIOQph0MrH9XWaqDZB6dAK5/J4Hr341CeXSjgRp1IzCPbhLS4SYDNeo4sEbdBNT0ZiFNbzaQWzcDdegopENHA7l1DJhbHYGa3iKk6S0G1r8qluogmUfjCuLuzfEFcfrdKpRHtxqoUbcC8+g2IR1uM1CjxhbE9XUbUNNOQpp2MpBbnYA6dBbSobOB3BoDzK3OQE27CGnaxcD6d7WlOkjm0Sjg+jcauP51FcqjrgZqVFdgHnUT0qGbgRo1ElijugE17S6kaXcDudUdqEOKkA4pBnJrBDC3UoCapgppmmpg/bvGUh0k8+gp4Pr3NHD9SxPKozQDNSoNmEc9hHToYaBGPQmsUT2AmqYLaZpuILfSgTpkCOmQYSC3hgNzKwOoaU8hTXsaWP+utVQHyTx6HLj+PQFc/24XyqPbDdSo24F5dIeQDncYqFGPAWvUHUBN7xTS9E4DuXUnUIdeQjr0MpBbw4C51Quo6V1Cmt5lYP2raqkOknn0CHD9exS4/t0tlEd3G6hRdwPz6B4hHe4xUKMeBtaoe4Ca9hbStLeB3OoN1OFeIR3uNZBbQ4G5dS9Q0/uENL3PwPpXzVIdJPPoQeD69xBw/btfKI/uN1Cj7gfmUR8hHfoYqFEPAGtUH6CmfYU07Wsgt/oCdegnpEM/A7k1BJhb/YCa9hfStL+B9a+6pTpI5tEg4Po3GLj+DRDKowEGatQAYB4NFNJhoIEaNRBYowYCNR0kpOkgA7k1CKjDYCEdBhvIrQHA3BoM1HSIkKZDDKx/NSzVQTKP+gHXv/7A9e8BoTx6wECNegCYRw8K6fCggRrVF1ijHgRq+pCQpg8ZyK2HgDoMFdJhqIHc6gPMraFATR8W0vRhA+tfTYt1iIn66zMVI5+lGPkMxchnJ0Y+MzHyWYmRz0iMfDZi5DMRI5+FGPkMxMhnH0Y+8zDyWYeRzziMfLZhyYjXpSJel454XSbiddmI1+UiXpePeF0h/PoR999H3TbMbY+57XG3PeG24W570m05w/nk3Yvq2k+yRfkeDUBzl9WvZL+hBKF+E2X6jY+X6Tc5SabfxKBQv2ky/WYI6ZAglGcp6TL9JqXK9NtDiDcglGcZcTL9JgrlWZqUvo5MvylC90Wc0HqRHJLp1xGqZ3FC85YmVdeF9I1Lkek3JUOm35BQ3UkR2pcE/5tn2aD9BpxN2fF7SDTjRgLGDQSM6wkY1xEwriVgXEPAuJqAcRUB40oCxhUEjMsJGJcRMC4lYFxCwLiYgHERAeNCAsYFBIzzCRjnETDOJWCcQ8A4m4BxFgHjTALGGQSM0wkYpxEwTiVgnELAOFmAMQrLmNVvVr9Z/Wb1m9VvVr9Z/Wb1m9VvVr829iv2/nurnPb7iJYEjC0IGJsTMDYjYGxKwNiEgLExAWMjAsaGBIwNCBjrEzDWI2CsS8BYh4CxNgFjLQLGZALGEAFjEgFjIgFjAgFjPAFjkIAxjoDRIWAMEDDWJGCsQcBYnYCxGgFjVQLGQ7nsZzxIwHiAgHE/AeM+Asa9BIx7CBh3EzC+Q8D4NgHjWwSMuwgY3yRgfIOA8XUCxp0EjDsIGF8jYHyVgHE7AeM2AsatBIxbCBg3EzBuImDcSMC4gYBxPQHjOgLGtQSMawgYVxMwpuaxnzGFgLE7AWM3AsauBIxdCBg7EzB2ImC8jYDxVgLGWwgYOxIw3kzAeBMB440EjB0IGG8gYLyegPE6Asb2BIztCBjbEjC2IWBsTcDYioCxJQFjCwLG5gSMzQgYmxIwNiFgbEzAeDav/YxnCBhPEzCeImA8ScB4goDxOAHjMQLGLwkYvyBg/JyA8SgB42cEjJ8SMH5CwHiEgPFjAsaPCBg/JGA8TMD4AQHj+wSM7xEwvkvAeIiA8SAB4wECxv0EjPsIGPcSMO4hYNxNwDg4n/2MgwgYBxIwDiBg7E/A2I+AsS8BYx8CxvsJGO8jYLyXgLE3AeM9BIx3EzDeRcDYi4DxTgLGOwgYbydg7EnAmEHAmE7A2IOAMY2AMZWAMYWAsTsBYzcCxq4EjF0IGDsTMHYiYMxdwH7GXASMOQkYcxAwZidgzEbAGEXAeCG//Yy/EzD+RsD4KwHjLwSMPxMw/kTA+CMB4w8EjN8TMH5HwPgtAeN5AsZvCBi/JmD8ioDxHAHjWQLGMwSMpwkYTxEwniRgPEHAeJyA8RgB4/iC9jOOI2AcS8A4hoBxNAHjKALGkQSMIwgYnyZgfIqA8UkCxuEEjE8QMD5OwPgYAeMwAsZHCRgfIWB8mIBxKAHjQwSMDxIwPkDAOISAcTAB4yACxoEEjAMIGPsTMPYjYOxLwNiHgLF8YfsZyxEwliVgLEPAWJqAsRQBY0kCxhIEjMUJGGMJGGMIGKMJGIsRMBYlYCxCwFiYgLEQAWNBAsYCBIz5CRjzETBeRsCYl4AxDwFjbgLGXASMOQkYcxAwZidgzEbAGEXAeKGQ/YzzitjPOJeAcQ4B42wCxlkEjDMJGGcQME4nYJxGwDiVgHEKAeNkAsZXCBhfJmB8iYBxEgHjiwSMLxAwPk/AOJGA8TkCxmcJGJ8hYJxAwDiegHEcAeNYAsYxBIyjCRhHETCOJGAcQcCYWMx+xgQCxngCxiABYxwBo0PAGCBgrEnAWIOAsToBYzUCxqoEjNcSMF5DwHg1AWMVAsarCBivJGC8goCxMgHj5QSMlQgYKxIwViBgLE/AWI6AsSwBYxkCxtIEjKUIGEsSMJYgYNwWbT/jVgLGLQSMmwkYNxEwbiRg3EDAuJ6AcR0B41oCxjUEjKsJGFcRMK4kYFxBwLicgHEZAeNSAsYlBIyLCRgXETAuJGBcQMA4n4BxHgHjXALGOQSMswkYZxEwziRgnEHAOJ2AsV2s/YxtCRjbEDC2JmBsRcDYkoCxBQFjcwLGZgSMTQkYmxAwNiZgbETA2JCAsQEBY30CxnoEjHUJGOsQMNYmYKxFwJhMwBgiYEwiYEwkYEwgYIwnYAwSMMYRMDoEjAECxpoCjJEHpG8nXbDv+ED2CG2LhF8/VTIq6mm3jXDbSLeNcttot41x21i3jXPbeLdNcNszbnvWbc+5baLbni/5nz5eKBnuNEf4X9VpxUznnvY5N8Ln3Eifc6N8zo32OTfG59xYn3PjfM6N9zk3wefcMz7nnvU595zPuYk+5573OfdC+FzkkQOZDAHgg4ScQCDywUnBQGJ8fHpSXLoTdFICccmpoYRAfEJqYsgJOQmhhB5xoWAwPRQfSkpOTU4KJDvxwXQnIyE5mBHu7sWSuBs1UtMXfTTNjtTU+TP7peowSUiHSQZyC/gAKGcSUNOXhDR9yUBuvQTU4WUhHV42kFvAB3c5LwM1fUVI01ekc8vV4SlLdZDMo1LA9a80cP2bLJRHkw3UqMnAPJoipMMUAzUK+MA5ZwpQ06lCmk41kFtTgTpME9JhmoHcAj4o0JkG1HS6kKbTDax/T1uqg2QexQLXv+LA9W+GUB7NMFCjZgDzaKaQDjMN1CjgAy6dmUBNZwlpOstAbs0C6jBbSIfZBnIL+GBSZzZQ0zlCms4xsP6NsFQHyTwqClz/igHXv7lCeTTXQI2aC8yjeUI6zDNQo4AP1HXmATWdL6TpfAO5NR+owwIhHRYYyC3gg5CdBUBNFwpputDA+jfSUh0k86ggcP0rBFz/Fgnl0SIDNWoRMI8WC+mw2ECNAj7A21kM1HSJkKZLDOTWEqAOS4V0WGogt4APXneWAjVdJqTpMgPr3yhLdZDMo8uA618+4Pq3XCiPlhuoUcuBebRCSIcVBmpUXmCNWgHUdKWQpisN5NZKoA6rhHRYZSC38gBzaxVQ09VCmq42sP6NtlQHyTzKBVz/cgPXvzVCebTGQI1aA8yjtUI6rDVQo3ICa9RaoKbrhDRdZyC31gF1WC+kw3oDuZUDmFvrgZpuENJ0g4H1b4ylOkjmUTbg+pcduP5tFMqjjQZq1EZgHm0S0mGTgRoVBaxRm4CabhbSdLOB3NoM1GGLkA5bDOTWhUK4vrYANd0qpOlWA+vfWEt1kMyjuUVw9+a8Ijj9tgnl0TYDNWobMI+2C+mw3UCNmlME19d2oKavCmn6qoHcehWow2tCOrxmILdmA3PrNaCmO4Q03WFg/RtnqQ6SeTQTuP7NAq5/O4XyaKeBGrUTmEevC+nwuoEaNQNYo14HavqGkKZvGMitN4A6vCmkw5sGcms6MLfeBGq6S0jTXQbWv/GW6iCZR1OB69804Pr3llAevWWgRr0FzKO3hXR420CNmgKsUW8DNX1HSNN3DOTWO0AddgvpsNtAbk0G5tZuoKZ7hDTdY2D9m2CpDpJ59DJw/XsFuP7tFcqjvQZq1F5gHu0T0mGfgRr1ErBG7QNqul9I0/0Gcms/UIcDQjocMJBbk4C5dQCo6UEhTQ8aWP+esVQHyTx6Abj+vQhc/w4J5dEhAzXqEDCP3hXS4V0DNep5YI16F6jpe0Kavmcgt94D6vC+kA7vG8iticDceh+o6QdCmn5gYP171lIdJPPoWeD69xxw/TsslEeHDdSow8A8+lBIhw8N1KhngDXqQ6CmHwlp+pGB3PoIqMPHQjp8bCC3JgBz62OgpkeEND1iYP17zlIdJPNoHHD9Gw9c/z4RyqNPDNSoT4B59KmQDp8aqFFjgTXqU6Cmnwlp+pmB3PoMqMNRIR2OGsitMcDcOgrU9HMhTT83sP5NtFQHyTwaBVz/RgPXvy+E8ugLAzXqC2AefSmkw5cGatRIYI36EqjpMSFNjxnIrWNAHY4L6XDcQG6NAObWcaCmJ4Q0PWFg/XveYh1iov76TMXIZylGPkMx8tmJkc9MjHxWYuQzEiOfjRj5TMTIZyFGPgMx8tmHkc88jHzWYeQzDiOfbfhIxOtHI14Pi3j9WMTrxyNePxHxenjE6yfDr0+6/55y22m3nXHbWbedc9tXbvvabTnD+eTdi//nB7NF+R4NQHOX1a9kv6EEoX4TZfqNj5fpNzlJpt/EoFC/aTL9ZgjpkCCUZynpMv0mpcr020OINyCUZxlxMv0mCuVZmpS+jky/KUL3RZzQepEckunXEapncULzliZV14X0jUuR6TclQ6bfkFDdSRHalwT/m2fZoP0GnE3Z8XtINONGAsYNBIzrCRjXETCuJWBcQ8C4moBxFQHjSgLGFQSMywkYlxEwLiVgXELAuJiAcREB40ICxgUEjPMJGOcRMM4lYJxDwDibgHEWAeNMAsYZBIzTCRinETBOJWCcQsA4WYAxCsuY1W9Wv1n9ZvWb1W9Wv1n9ZvWb1W9Wvzb2K/b+e6uc9vuIlgSMLQgYmxMwNiNgbErA2ISAsTEBYyMCxoYEjA0IGOsTMNYjYKxLwFiHgLE2AWMtAsZkAsYQAWMSAWMiAWMCAWM8AWOQgDGOgNEhYAwQMNYkYKxBwFidgLEaAWNVAsZDuexnPEjAeICAcT8B4z4Cxr0EjHsIGHcTML5DwPg2AeNbBIy7CBjfJGB8g4DxdQLGnQSMOwgYXyNgfJWAcTsB4zYCxq0EjFsIGDcTMG4iYNxIwLiBgHE9AeM6Asa1BIxrCBhXEzCm5rGfMYWAsTsBYzcCxq4EjF0IGDsTMHYiYLyNgPFWAsZbCBg7EjDeTMB4EwHjjQSMHQgYbyBgvJ6A8ToCxvYEjO0IGNsSMLYhYGxNwNiKgLElAWMLAsbmBIzNCBibEjA2IWBsTMB4Nq/9jGcIGE8TMJ4iYDxJwHiCgPE4AeMxAsYvCRi/IGD8nIDxKAHjZwSMnxIwfkLAeISA8WMCxo8IGD8kYDxMwPgBAeP7BIzvETC+S8B4iIDxIAHjAQLG/QSM+wgY9xIw7iFg3E3AODif/YyDCBgHEjAOIGDsT8DYj4CxLwFjHwLG+wkY7yNgvJeAsTcB4z0EjHcTMN5FwNiLgPFOAsY7CBhvJ2DsScCYQcCYTsDYg4AxjYAxlYAxhYCxOwFjNwLGrgSMXQgYOxMwdiJgzF3AfsZcBIw5CRhzEDBmJ2DMRsAYRcB4Ib/9jL8TMP5GwPgrAeMvBIw/EzD+RMD4IwHjDwSM3xMwfkfA+C0B43kCxm8IGL8mYPyKgPEcAeNZAsYzBIynCRhPETCeJGA8QcB4nIDxGAHj+IL2M44jYBxLwDiGgHE0AeMoAsaRBIwjCBifJmB8ioDxSQLG4QSMTxAwPk7A+BgB4zACxkcJGB8hYHyYgHEoAeNDBIwPEjA+QMA4hIBxMAHjIALGgQSMAwgY+xMw9iNg7EvA2IeAsXxh+xnLETCWJWAsQ8BYmoCxFAFjSQLGEgSMxQkYYwkYYwgYowkYixEwFiVgLELAWJiAsRABY0ECxgIEjPkJGPMRMF5GwJiXgDEPAWNuAsZcBIw5CRhzEDBmJ2DMRsAYRcB4oZD9jPOK2M84l4BxDgHjbALGWQSMMwkYZxAwTidgnEbAOJWAcQoB42QCxlcIGF8mYHyJgHESAeOLBIwvEDA+T8A4kYDxOQLGZwkYnyFgnEDAOJ6AcRwB41gCxjEEjKMJGEcRMI4kYBxBwJhYzH7GBALGeALGIAFjHAGjQ8AYIGCsScBYg4CxOgFjNQLGqgSM1xIwXkPAeDUBYxUCxqsIGK8kYLyCgLEyAePlBIyVCBgrEjBWIGAsT8BYjoCxLAFjGQLG0gSMpQgYSxIwliBg3BZtP+NWAsYtBIybCRg3ETBuJGDcQMC4noBxHQHjWgLGNQSMqwkYVxEwriRgXEHAuJyAcRkB41ICxiUEjIsJGBcRMC4kYFxAwDifgHEeAeNcAsY5BIyzCRhnETDOJGCcQcA4nYCxXaz9jG0JGNsQMLYmYGxFwNiSgLEFAWNzAsZmBIxNCRibEDA2JmBsRMDYkICxAQFjfQLGegSMdQkY6xAw1iZgrEXAmEzAGCJgTCJgTCRgTCBgjCdgDBIwxhEwOgSMAQLGmgKMkQekbyddsO9QIHuEtkXCr78pGRV13m3fuu07t33vth/c9qPbfnLbz277xW2/uu03t/3utgtuiyrl9lPqP31kLxXuNEf4X9VpxUznzvuc+9bn3Hc+5773OfeDz7kffc795HPuZ59zv/ic+9Xn3G8+5373OXfB55wSLfO5bD7nsofPRR45ooDJgPxDeicQiPzigGAgMT4+PSku3Qk6KYG45NRQQiA+ITUx5ISchFBCj7hQMJgeig8lJacmJwWSnfhgupORkBzMCHeXoxTuRo3UNIePptmRmjp/Zr9UHXIK6ZDTQG4BvwDByQnUNJeQprkM5FYuoA65hXTIbSC3gF9c4eQGappHSNM80rnl6qDWaxt1kMwjB7j+xQHXv7xCeZTXQI3KC7yfLhPS4TIDNQr4hSvOZUBN8wlpms9AbuUD6pBfSIf8BnIL+EU5Tn6gpgWENC1gYP07X9JOHSTzqDpw/asBXP8KCuVRQQM1qiDwfiokpEMhAzUK+AVPTiGgpoWFNC1sILcKA3UoIqRDEQO5BfxiLqcIUNOiQpoWNbD+fVvSTh0k8+ga4Pp3LXD9KyaUR8UM1KhiwPspWkiHaAM1CviFck40UNMYIU1jDORWDFCHWCEdYg3kFvCLAJ1YoKbFhTQtbmD9+66knTpI5tGVwPXvKuD6V0Ioj0oYqFElgPdTSSEdShqoUcAvsHRKAjUtJaRpKQO5VQqoQ2khHUobyC3gF486pYGalhHStIyB9e/7knbqIJlHlYDr3+XA9a+sUB6VNVCjygLvp3JCOpQzUKOAX5jrlANqWl5I0/IGcqs8UIcKQjpUMJBbwC86dioANa0opGlFA+vfDyXt1EEyj8oB17/ywPWvklAeVTJQoyoB76fLhXS43ECNAn5Bt3M5UNPKQppWNpBblYE6XCGkwxUGcgv4xerOFUBNrxTS9EoD69+PJe3UQTKPSgHXv9LA9e8qoTy6ykCNugp4P1UR0qGKgRoFfCCAUwWo6dVCml5tILeuBupwjZAO1xjILeCDHJxrgJpeK6TptQbWv59K2qmDZB7BHmTh3puRD+64VP2qCuVRVQM1qirwfqompEM1AzUK+AASpxpQ0+pCmlY3kFvVgTrUENKhhoHcAj44xqkB1LSmkKY1Dax/P5e0UwfJPNoIXP82Ade/gFAeBQzUqADwfnKEdHAM1CjgA48cB6hpnJCmcQZyKw6oQ1BIh6CB3AI+qMoJAjWNF9I03sD690tJO3WQzKO1wPVvHXD9SxDKowQDNSoBeD8lCumQaKBGAR+w5iQCNU0S0jTJQG4lAXUICekQMpBbwAfjOSGgpslCmiYbWP9+LWmnDpJ5tBK4/q0Crn+1hPKoloEaVQt4P9UW0qG2gRoFfKCjUxuoaR0hTesYyK06QB3qCulQ10BuAR/E6dQFalpPSNN6Bta/30raqYNkHi0Frn/LgOtffaE8qm+gRtUH3k8NhHRoYKBGAR8g6zQAatpQSNOGBnKrIVCHRkI6NDKQW8AH/zqNgJo2FtK0sYH17/eSduogmUcLgevfIuD610Qoj5oYqFFNgPdTUyEdmhqoUcAHVjtNgZo2E9K0mYHcagbUobmQDs0N5BbwQeNOc6CmLYQ0bWFg/btQ0k4dJPNoLnD9mwdc/1oK5VFLAzWqJfB+aiWkQysDNWoOsEa1AmraWkjT1gZyqzVQhzZCOrQxkFuzgbnVBqhpWyFN2xpY/6Is1UEyj2YC179ZwPWvnVAetTNQo9oB86i9kA7tDdSoGcAa1R6o6XVCml5nILeuA+pwvZAO1xvIrenA3LoeqOkNQpreYGD9y2axDjFRf32mYuSzFCOfoRj57MTIZyZGPisx8hmJkc9GjHwmYuSzECOfgRj57MPIZx5GPusw8hmHkc82PBnxM6ciXp+OeH0m4vXZiNfnIl5/FfH66/DrDu7/50a33eS2m93W0W23uO1Wt93mtpzhfPLuRXXtJ9mifI8GoLnL6ley31CCUL+JMv3Gx8v0m5wk029iUKjfNJl+M4R0SBDKs5R0mX6TUmX67SHEGxDKs4w4mX4ThfIsTUpfR6bfFKH7Ik5ovUgOyfTrCNWzOKF5S5Oq60L6xqXI9JuSIdNvSKjupAjtS4L/zbNs0H4Dzqbs+D0kmnEjAeMGAsb1BIzrCBjXEjCuIWBcTcC4ioBxJQHjCgLG5QSMywgYlxIwLiFgXEzAuIiAcSEB4wICxvkEjPMIGOcSMM4hYJxNwDiLgHEmAeMMAsbpBIzTCBinEjBOIWCcLMAYhWXM6jer36x+s/rN6jer36x+s/rN6jerXxv7FXv/vVVO+31ESwLGFgSMzQkYmxEwNiVgbELA2JiAsREBY0MCxgYEjPUJGOsRMNYlYKxDwFibgLEWAWMyAWOIgDGJgDGRgDGBgDGegDFIwBhHwOgQMAYIGGsSMNYgYKxOwFiNgLEqAeOhXPYzHiRgPEDAuJ+AcR8B414Cxj0EjLsJGN8hYHybgPEtAsZdBIxvEjC+QcD4OgHjTgLGHQSMrxEwvkrAuJ2AcRsB41YCxi0EjJsJGDcRMG4kYNxAwLiegHEdAeNaAsY1BIyrCRhT89jPmELA2J2AsRsBY1cCxi4EjJ0JGDsRMN5GwHgrAeMtBIwdCRhvJmC8iYDxRgLGDgSMNxAwXk/AeB0BY3sCxnYEjG0JGNsQMLYmYGxFwNiSgLEFAWNzAsZmBIxNCRibEDA2JmA8m9d+xjMEjKcJGE8RMJ4kYDxBwHicgPEYAeOXBIxfEDB+TsB4lIDxMwLGTwkYPyFgPELA+DEB40cEjB8SMB4mYPyAgPF9Asb3CBjfJWA8RMB4kIDxAAHjfgLGfQSMewkY9xAw7iZgHJzPfsZBBIwDCRgHEDD2J2DsR8DYl4CxDwHj/QSM9xEw3kvA2JuA8R4CxrsJGO8iYOxFwHgnAeMdBIy3EzD2JGDMIGBMJ2DsQcCYRsCYSsCYQsDYnYCxGwFjVwLGLgSMnQkYOxEw5i5gP2MuAsacBIw5CBizEzBmI2CMImC8kN9+xt8JGH8jYPyVgPEXAsafCRh/ImD8kYDxBwLG7wkYvyNg/JaA8TwB4zcEjF8TMH5FwHiOgPEsAeMZAsbTBIynCBhPEjCeIGA8TsB4jIBxfEH7GccRMI4lYBxDwDiagHEUAeNIAsYRBIxPEzA+RcD4JAHjcALGJwgYHydgfIyAcRgB46MEjI8QMD5MwDiUgPEhAsYHCRgfIGAcQsA4mIBxEAHjQALGAQSM/QkY+xEw9iVg7EPAWL6w/YzlCBjLEjCWIWAsTcBYioCxJAFjCQLG4gSMsQSMMQSM0QSMxQgYixIwFiFgLEzAWIiAsSABYwECxvwEjPkIGC8jYMxLwJiHgDE3AWMuAsacBIw5CBizEzBmI2CMImC8UMh+xnlF7GecS8A4h4BxNgHjLALGmQSMMwgYpxMwTiNgnErAOIWAcTIB4ysEjC8TML5EwDiJgPFFAsYXCBifJ2CcSMD4HAHjswSMzxAwTiBgHE/AOI6AcSwB4xgCxtEEjKMIGEcSMI4gYEwsZj9jAgFjPAFjkIAxjoDRIWAMEDDWJGCsQcBYnYCxGgFjVQLGawkYryFgvJqAsQoB41UEjFcSMF5BwFiZgPFyAsZKBIwVCRgrEDCWJ2AsR8BYloCxDAFjaQLGUgSMJQkYSxAwbou2n3ErAeMWAsbNBIybCBg3EjBuIGBcT8C4joBxLQHjGgLG1QSMqwgYVxIwriBgXE7AuIyAcSkB4xICxsUEjIsIGBcSMC4gYJxPwDiPgHEuAeMcAsbZBIyzCBhnEjDOIGCcTsDYLtZ+xrYEjG0IGFsTMLYiYGxJwNiCgLE5AWMzAsamBIxNCBgbEzA2ImBsSMDYgICxPgFjPQLGugSMdQgYaxMw1iJgTCZgDBEwJhEwJhIwJhAwxhMwBgkY4wgYHQLGAAFjTQHGyAPSt5Mu2HdaIHuEtkXCrzuViorq7LYubuvqtm5u6+62FLelui3NbT3clu62DLf1dNvtbrvDbXeW+k8fvUqFO80R/ld1WjHTuc4+57r4nOvqc66bz7nuPudSfM6l+pzrFT4XeeRAio38Ra0TCET+YjoYSIyPT0+KS3eCTkogLjk1lBCIT0hNDDkhJyGU0CMuFAymh+JDScmpyUmBZCc+mO5kJCQHM8Ld3VUKdyNEanqXj6bZkZo6f2a/VB3uFtLhbgO5BfwFu3M3UNN7hDS9x0Bu3QPUobeQDr0N5BbwjRGnN1DTe4U0vVc6t1wdOlmqg2QetQSuf62A6999Qnl0n4EadR8wj+4X0uF+AzUK+Iaecz9Q0z5CmvYxkFt9gDr0FdKhr4HcAr4R6/QFatpPSNN+Bta/zpbqIJlHTYHrXzPg+tdfKI/6G6hR/YF5NEBIhwEGahTwAwTOAKCmA4U0HWggtwYCdRgkpMMgA7kF/OCHMwio6WAhTQcbWP+6WKqDZB41BK5/jYDr3xChPBpioEYNAebRA0I6PGCgRgE/sOQ8ANT0QSFNHzSQWw8CdXhISIeHDOQW8INmzkNATYcKaTrUwPrX1VIdJPOoLnD9qwdc/x4WyqOHDdSoh4F59IiQDo8YqFHAD0g6jwA1fVRI00cN5NajQB2GCekwzEBuAT/Y6gwDavqYkKaPGVj/ulmqg2QeJQPXv1rA9e9xoTx63ECNehyYR08I6fCEgRoF/EC28wRQ0+FCmg43kFvDgTo8KaTDkwZyC/hBeudJoKZPCWn6lIH1r7ulOkjmUQJw/UsErn9PC+XR0wZq1NPAPBohpMMIAzUK+AcgzgigpiOFNB1pILdGAnUYJaTDKAO5BfzDHWcUUNPRQpqONrD+pViqg2QeOcD1Lw64/o0RyqMxBmrUGGAejRXSYayBGgX8gzNnLFDTcUKajjOQW+OAOowX0mG8gdwC/qGgMx6o6QQhTScYWP9SLdUhcszZwGNOI+HsQcKZTsKZQcLZk4TzdhLOO0g47wRy5nT7UC1HBGuRqD8faP5OAjqjGTsTMHYhYOxKwNiNgLE7AWMKAWOqUI1HMIaE+pXizer3/1/94vqOc8T6dtIDXk2I3Ks8497Xz7rtObdNdNvzbnvBbS+6bZLbXnLby257xW2T3TbFbVPdNs1t00tF/fnLZZ4p9dcvnHnW59xzPucm+px73ufcCz7nXvQ5N8nn3DSfc9PD59RmLnfUH78AiDzQxfSlUpYno/OffyK1mFHqP//OzDzpKpA3EwD6N1MvAX6Lkv6fX6M4M4C/kZlJ4nxYOF8m4XyFhHMyCecUEs6pJJyIepkU7iuSM/Nvxy+1fgJ/o+E8IzQ36DEDf0PiPEsyZuBvXJznSMYM/A2OM5FkzMDfCDnPk4wZ+Bsm5wWSMQN/Y+W8SDJm4G/AnEmGxhz4d4fjvZgG9EqzhN7Fj+wXrIN3ONOBcz8L4mXdw/nz3iwbON/nAMbs/WZWscVE/fUbkiO/GTnyG5Ejvwk58huQI7/5OPIbjyO/6XhOxOtvi//715G/LJoe8bpDxOsbI17fFPH65ojXHSNe3xLx+taI17eFX891/53ntvluW+C2hW5b5LbFbltS6j+/pFK/a8kR9dcD7SHm2v5Lqv8c8WJ9O4E//cY0Z/j1UleXZW5b7rYVmX8ZtjT8y7DIc8t8zi33Obei1F9/kZYLK9afJvVSC8RSVCHLCDjLQH2pMS4H/rJwBfgjA6Zu3nlZN6/vzbvS1WWV21a7bU3mm3elz025yufcap9zawzcvPOAN+9K4M27CnjzrgbevGtIb975WTev78271tVlndvWu21D5pt3rc9Nuc7n3HqfcxsM3LzzgTfvWuDNuw54864H3rwbSG/eBVk3r+/Nu9HVZZPbNrttS+abd6PPTbnJ59xmn3NbDNy8C4A370bgzbsJePNuBt68W0hv3oVZN6/vzbvV1WWb27a77dXMN+9Wn5tym8+57T7nXjVw8y4E3rxbgTfvNuDNux14875KevMuyrp5fW/e11xddrhtp9tez3zzvuZzU+7wObfT59zrBm7eRcCb9zXgzbsDePPuBN68r5PevIuzbl7fm/cNV5c33bbLbW9lvnnf8Lkp3/Q5t8vn3FsGbt7FwJv3DeDN+ybw5t0FvHnfIr15l2TdvL4379uuLu+4bbfb9mS+ed/2uSnf8Tm32+fcHgM37xLgzfs28OZ9B3jz7gbevHuEboLs4Hl9JTtuXvfixuxE5vfe8PvhOcN5nTPqrwe6iGWLoihi/1doPskWFSX5/8jqV7LfUIJQv4ky/cbHy/SbnCTTb2JQqN80mX4zhHRIEMqzlHSZfpNSZfrtIcQbEMqzjDiZfhOF8ixNSl9Hpt8UofsiTmi9SA7J9OsI1bM4oXlLk6rrQvrGpcj0m5Ih029IqO6kCO1Lgv/NM7QX2JQdv4dEM24kYNxAwLiegHEdAeNaAsY1BIyrCRhXETCuJGBcQcC4nIBxGQHjUgLGJQSMiwkYFxEwLiRgXEDAOJ+AcR4B41wCxjkEjLMJGGcRMM4kYJxBwDidgHEaAeNUAsYpBIyTBRijsIxZ/Wb1m9VvVr9Z/Wb1m9VvVr9Z/Wb1a2O/Yu+/t8ppv49oScDYgoCxOQFjMwLGpgSMTQgYGxMwNiJgbEjA2ICAsT4BYz0CxroEjHUIGGsTMNYiYEwmYAwRMCYRMCYSMCYQMMYTMAYJGOMIGB0CxgABY00CxhoEjNUJGKsRMFYlYDyUy37GgwSMBwgY9xMw7iNg3EvAuIeAcTcB4zsEjG8TML5FwLiLgPFNAsY3CBhfJ2DcScC4g4DxNQLGVwkYtxMwbiNg3ErAuIWAcTMB4yYCxo0EjBsIGNcTMK4jYFxLwLiGgHE1AWNqHvsZUwgYuxMwdiNg7ErA2IWAsTMBYycCxtsIGG8lYLyFgLEjAePNBIw3ETDeSMDYgYDxBgLG6wkYryNgbE/A2I6AsS0BYxsCxtYEjK0IGFsSMLYgYGxOwNiMgLEpAWMTAsbGBIxn89rPeIaA8TQB4ykCxpMEjCcIGI8TMB4jYPySgPELAsbPCRiPEjB+RsD4KQHjJwSMRwgYPyZg/IiA8UMCxsMEjB8QML5PwPgeAeO7BIyHCBgPEjAeIGDcT8C4j4BxLwHjHgLG3QSMg/PZzziIgHEgAeMAAsb+BIz9CBj7EjD2IWC8n4DxPgLGewkYexMw3kPAeDcB410EjL0IGO8kYLyDgPF2AsaeBIwZBIzpBIw9CBjTCBhTCRhTCBi7EzB2I2DsSsDYhYCxMwFjJwLG3AXsZ8xFwJiTgDEHAWN2AsZsBIxRBIwX8tvP+DsB428EjL8SMP5CwPgzAeNPBIw/EjD+QMD4PQHjdwSM3xIwnidg/IaA8WsCxq8IGM8RMJ4lYDxDwHiagPEUAeNJAsYTBIzHCRiPETCOL2g/4zgCxrEEjGMIGEcTMI4iYBxJwDiCgPFpAsanCBifJGAcTsD4BAHj4wSMjxEwDiNgfJSA8RECxocJGIcSMD5EwPggAeMDBIxDCBgHEzAOImAcSMA4gICxPwFjPwLGvgSMfQgYyxe2n7EcAWNZAsYyBIylCRhLETCWJGAsQcBYnIAxloAxhoAxmoCxGAFjUQLGIgSMhQkYCxEwFiRgLEDAmJ+AMR8B42UEjHkJGPMQMOYmYMxFwJiTgDEHAWN2AsZsBIxRBIwXCtnPOK+I/YxzCRjnEDDOJmCcRcA4k4BxBgHjdALGaQSMUwkYpxAwTiZgfIWA8WUCxpcIGCcRML5IwPgCAePzBIwTCRifI2B8loDxGQLGCQSM4wkYxxEwjiVgHEPAOJqAcRQB40gCxhEEjInF7GdMIGCMJ2AMEjDGETA6BIwBAsaaBIw1CBirEzBWI2CsSsB4LQHjNQSMVxMwViFgvIqA8UoCxisIGCsTMF5OwFiJgLEiAWMFAsbyBIzlCBjLEjCWIWAsTcBYioCxJAFjCQLGbdH2M24lYNxCwLiZgHETAeNGAsYNBIzrCRjXETCuJWBcQ8C4moBxFQHjSgLGFQSMywkYlxEwLiVgXELAuJiAcREB40ICxgUEjPMJGOcRMM4lYJxDwDibgHEWAeNMAsYZBIzTCRjbxdrP2JaAsQ0BY2sCxlYEjC0JGFsQMDYnYGxGwNiUgLEJAWNjAsZGBIwNCRgbEDDWJ2CsR8BYl4CxDgFjbQLGWgSMyQSMIQLGJALGRALGBALGeALGIAFjHAGjQ8AYIGCsKcAowflKdhnO/x7ZMwEHA4nx8elJcelO0EkJxCWnhhIC8QmpiSEn5CSEEnrEhYLB9FB8KCk5NTkpkOzEB9OdjITkYEbE/wQ1+IQomcGjx5wNOOZEkjFnB445iWTMOYBjDhkac+DSDicZqF/j7BxFt1YUB2dtEs46JJx1STjrkXDWJ+FsQMLZkISzEQlnYxLOJiScTUk4m5FwNifhbEHC2ZKEsxUJZ2sSzjYknG1JONuRcLYn4byOhPN6Es4bSDg7kHDeSMJ5EwnnzSScHUk4byHhvJWE8zYSzk4knJ1JOLuQcHYl4exGwtmdhDOFhDOVhDONhLMHCWc6CWcGCWdPEs7bSTjvIOG8k4SzFwnnXSScd5Nw3kPC2ZuE814SzvtIOO8n4exDwtmXhLMfCWd/Es4BJJwDSTgHkXAOJuEcQsL5AAnngyScD5FwDiXhfJiE8xESzkdJOIeRcD5Gwvk4CecTJJzDSTifJOF8ioTzaRLOESScI0k4R5FwjibhHEPCOZaEcxwJ53gSzgkknM+QcD5LwvkcCedEEs7nSThfIOF8kYRzEgnnSyScL5NwvkLCOZmEcwoJ51QSzmkknNNJOGeQcM4k4ZxFwjmbhHMOCedcEs55JJzzSTgXkHAuJOFcRMK5mIRzCQnnUhLOZSScy0k4V5BwriThXEXCuZqEcw0J51oSznUknOtJODeQcG4k4dxEwrmZhHMLCedWEs5tJJzbSThfJeF8jYRzBwnnThLO10k43yDhfJOEcxcJ51sknG+TcL5DwrmbhHMPCedeEs59JJz7STgPkHAeJOE8RML5LgnneySc75NwfkDCeZiE80MSzo9IOD8m4TxCwvkJCeenJJyfkXAeJeH8nITzCxLOL0k4j5FwHifhPEHCeZKE8xQJ52kSzjMknGeFOHOAOc9F9HWpz+79oBSur8OlZPTLDtbvK6B+zbNz5PbXURyc35Bwnifh/JaE8zsSzu9JOH8g4fyRhPMnEs6fSTh/IeH8lYTzNxLO30k4L5Bwqg4ZOLORcGYn4cxBwpmThDMXCWduEs48JJx5STgvI+HMR8KZn4SzAAlnQRLOQiSchUk4i5BwFiXhLEbCGU3CGUPCGUvCWZyEswQJZ0kSzlIknKVJOMuQcJYl4SxHwlmehLMCCWdFEs5KJJyXk3BWJuG8goTzShLOq0g4q5BwXk3CeQ0J57UknFVJOKuRcFYn4axBwlmThDNAwumQcMaRcAZJOONJOBNIOBNJOJNIOEMknMkknLVIOGuTcNYh4axLwlmPhLM+CWcDEs6GJJyNSDgbk3A2IeFsSsLZjISzOQlnCxLOliScrUg4W5NwtiHhbEvC2Y6Esz0J53UknNeTcN5AwtmBhPNGEs6bSDhvJuHsSMJ5CwnnrSSct5FwdiLh7EzC2YWEsysJZzcSzu4knCkknKkknGkknD1IONNJODNIOHuScN5OwnkHCeedJJy9SDjvIuG8m4TzHhLO3iSc95Jw3kfCeT8JZx8Szr4knP1IOPuTcA4g4RxIwjmIhHMwCecQEs4HSDgfJOF8iIRzKAnnwyScj5BwPkrCOYyE8zESzsdJOJ8g4RxOwvkkCedTJJxPk3COIOEcScI5ioRzNAnnGBLOsSSc40g4x5NwTiDhfIaE81kSzudIOCeScD5PwvkCCeeLJJyTSDhfIuF8mYTzFRLOySScU0g4p5JwTiPhnE7COYOEcyYJ5ywSztkknHNIOOcKcWbPxHmpz4O+AjjmeYbGHLi0w5mfDaff3lIc+biA5L5ZSMK5iIRzMQnnEhLOpSScy0g4l5NwriDhXEnCuYqEczUJ5xoSzrUknOtIONeTcG4g4dxIwrmJhHMzCecWEs6tJJzbSDi3k3C+SsL5GgnnDhLOnSScr5NwvkHC+SYJ5y4SzrdION8m4XyHhHM3CeceEs69JJz7SDj3k3AeIOE8SMJ5iITzXRLO90g43yfh/ICE8zAJ54cknB+RcH5MwnmEhPMTEs5PSTg/I+E8SsL5OQnnFyScX5JwHiPhPE7CeYKE8yQJ5ykhzopgztMRnP/9zGvgX33m1Vla6i99Of/y87POssx99fjXn8V1lv+5r+AlfK7XWVHKRy+vr6R/1tfKi/cV+qdcqy7SV3LGPx/jav++Av9GrzU6vby+An+vr7X/u6+Ev8u17n/1Ff/3x7he21d8xj/Ra8Pf0cvrK0nf18a/31fa/+La9Hf7SvrfY9z89/oK/B29tvwTvby+Qv59bf3nfSVdjGvbP+0r6eJj3P7P+orT6fXqv9HL6yvuz3299u/7CmTm2vEv+0rM+OsYd/67vkJ+er1+KXqF+0r/T2fOG5feV5zH9eal9hX/xxh3XVpfgUi93gLo5f0NzTsQ7dXhvt8H6kuNcY/Q3/ZkD/8L6ts5kw03F69k59h3n80Gypl0p4ck5zkSH/MVCefXJJzfkHCeJ+H8loTzOxLO70k4fyDh/JGE8ycSzp9JOH8h4fyVhPM3Es7fhTgze4NL3c/nBI75AsmYcwHHHJWdY8y5gWPORjLmPMAxZycZc17gmHOQjPky4Jhzkow5H3DMuUjGnB845twkYy4AHHMekjEXBI45L8mYCwHHfBnJmAsDx5yPZMxFgGPOTzLmosAxFyAZczHgmAuSjDkaOOZCJGOOAY65MMmYY4FjLkIy5uLAMRclGXMJ4JiLkYy5JHDM0SRjLgUccwzJmEsDxxxLMuYywDEXJxlzWeCYS5CMuRxwzCVJxlweOOZSJGOuABxzaZIxVwSOuQzJmCsBx1yWZMyXA8dcjmTMlYFjLg8cc46o/7w/fjL8JnmC2xLdluS2kNuS3VbLbbXdVsdtdd1Wz231w+Np6LZGbmvstiZua+q2Zm5r7rYWbmvptlZua+22Nm5r67Z2bmvvtuvcdr3bbnBbB7fd6Lab3Haz2zq67Ra33eq229zWyW2d3dbFbV3d1s1t3d2W4rZUt6W5TX2YM91tGW7r6bbb3XaH2+50Wy+33eW2u912j9t6u+1et93ntvvd1sdtfd3Wz2393TbAbQPdNshtg902xG0PuO1Btz3ktqFue9htj7jtUbcNc9tjbnvcbU+4bbjbnnTbU2572m0j3DbSbaPcNtptY9w21m3j3DbebRPc9ozbnnXbc26b6Lbn3faC21502yS3veS2l932itsmu22K26a6bZrbprtthttmum2W22a7bY7b5rptntvmu22B2xa6bZHbFrttiduWum2Z25a7bYXbVrptldtWu22N29a6bZ3b1rttg9s2um2T2za7bYvbtrptm9u2u+1Vt73mth1u2+m21932htvedNsut73ltrfd9o7bdrttj9v2um2f2/a77YDbDrrtkNveddt7bnvfbR+47bDbPnTbR2772G1H3PaJ2z5122duO+q2z932hdu+dNsxtx132wm3nXTbKbeddtsZt5112zm3feW2r932jdvOu+1bt33ntu/d9oPbfnTbT2772W2/uO1Xt/3mtt/ddsFt6sbJ5rbsbsvhtpxuy+W23G7L47a8brvMbfnclt9tBdxW0G2F3FbYbUXcVtRtxdwW7bYYt8W6rbjbSritpNtKua2028q4razbyrmtvNsquK2i2yq57XK3VXbbFW670m1Xua2K26522zVuu9ZtVd1WzW3V3VbDbTXdFnCb47Y4twXdFu+2BLclui3JbSG3Jbutlttqu62O2+q6rZ7b6qvPg7itodsaua2x25q4ranbmrmtudtauK2l21q5rbXb2ritrdvaua29265z2/Vuu8FtHdx2o9tuctvNbuvotlvcdqvbbnNbJ7d1dlsXt3V1Wze3dXdbittS3Zbmth5uS3dbhtt6uu12t93htjvd1sttd7ntbrfd47bebrvXbfe57X639XFbX7f1c1t/tw1w20C3DXLbYLcNcdsDbnvQbQ+5bajbHnbbI2571G3qGffq+fHq2ezquefqmeLqed3qWdjqOdPqGc7q+cjq2cPqub7qmbnqebTqWa/qOarqGaXq+Z/q2ZrquZXqmZDqeYvqWYbqOYHqGXzq+Xbq2XHquWzqmWdT3Kae1aWeg6WeMaWe36SejaSeO6Se6aOel6OeRaOezaKee6KeA6KesaGeX6GeDaGeu6CeaaCeF6C+i199z736Dnn1/ezqu8/V94qr7+xW34etvmtafY+z+o5k9f3D6rt9t7hNfSet+r5X9V2q6ntK1XeAqu/XVN9dqb4XUn3novo+Q/Vdgep7+NR33Knvj1Pfzaa+90x9p5j6vi71XVjqe6bUdzip70dS3z2kvtdHfWeO+j4a9V0v6ntU1HeUqO//UN+tob63Qn0nhPq+BfVdBup7AtTf4Ku/b1d/O67+Llv9zbNa29Tf6qq/g1V/L6H+fkB9Nl997l19plx9Xlt9Flp9zlh9hld9PlZ99lR9rlN9ZlJ9HlF91k99jk59Rk19/kt9HkptEtTnZdTnR9TnKdTnC9T77er9Z/V+rHp/Ur1fp96/Uu/nqPc31O/71e+/1e+D1e9H1e8L1e/P1O+T1O9X1O8blP9WflT5M+VX1P5d7WfV/k7td9T6n/0/5SdKfcZLHQlRfxxhtKgc4bj6TJT6jJD6zIz6DIn6TIX6jIF6z129B63ek1XvUar37NR7WOo9HfUeh/qdv/oduPqdsPodqfqdofodmvqdkvodi/qdg/LgypMqj6Y8S0W3VXKb2uOpPY96xtCVbrvKbVXcdrXbrnHbtW6r6rZqbqvuthpuq+k2tQlz3BbntqDb4qP+epTN9cfra8L/xn7esNR9b85uGvlz3n9Mnlt+ZZnPs98WGWumibXWxNpqYr00LHM1sfma2HpNbKMm9rYmtlsTO6KJfaqJfa2JndfE1Lp5sVguTSxWEyuhiVXRxK7RxJI1sdqaWGtNrK0m1kUT66aJ9dbE7tPEHtHEhmliEzSxZzWxmZrYbE1stSa2VhN7QxPbpYkd1sQ+0sTOaGLnNLELmli27BePFdXEojWxyprYlZpYgiaWpIk118RaamK3amKdNLFemtjdmtiDmthQTWyMJjZOE3tRE5uuic0Px3Y9s3vHnCdT/vT3jEs1153RxM5pYhc0sWw5Lh4rqolFa2KVNbErNbEETSxJE2uuibXUxG7VxDppYr00sbs1sQc1saGa2BhNbJwmNlUTm66JLdfEVmpir2liOzWxdzWx9zWxE5rYKU3sF03sN02sYM6LxwprYhU0sUqamKOJBTWxxppYU03sJk2soybWUxO7QxMbpIkN0cRGaGKjNLGXNbHJmthiTWypJrZVE9uuie3XxA5qYh9rYsc0sXPhmN969J0uP3NdPBbUxBprYk01sZs0sY6aWE9N7A5NbJAmNkQTG6GJjdLEXtbEJmtiizWxpZrYVk1suya2XxM7qIl9oYkd08R+0MR+0sQuy33xWH5NrIwmVk4Tq66J1dTE6mtiDTWx6zWxDppYmiaWron108QGaGLDNbGnNLEXNLFJmth8TWyhJrZRE9usie3WxPZqYp9qYkc1sfOa2HeaWK48F4/l0cRKaGKlNLHLNbGqmlgwHPNbj5I11/XTxAZoYsM1sac0sRc0sUma2HxNbKEmtlET26yJ7dbE9mpin2piRzWx85rYd5pYrrwXj+XRxEpoYqU0sWs0saqaWG1NrK4m1lYTa6+JddPEUjSx+zSxPprYME3scU3sWU1soiY2WxObq4mt1cTWa2K7NLG3NbGPNLEjmtg5TexrTSzbZReP5dDEojWxWE3sSk2siiaWpIkla2ItNbHWmlgnTayLJpahifXWxAaEY37r0YOa69ZqYus1sV2a2Nua2Eea2BFN7Jwm9rUmli3fxWM5NLFoTSxWE7tSE6uiiSVpYsmaWEtNrLUm1kkT66KJ3a2J9dbEhmpij2hi4zSxCZrYdE1spia2UhNbrYnt1MTe0MTe18QOa2KnNLEzmthvmtgFTaxw/ovHimpilTSxyppYUBNL0MSaamLNNbGOmtitmtgdmlgvTWyIJvagJjZKExujiU3WxKZqYvM0seWa2PpwzG892qq57jdN7IImVrjAxWNFNbFKmlhlTSyoiSVoYk01seaaWEdN7FZN7A5NrJcmNkQTe1ATG6WJjdHEJmtiUzWxpZrYck1suyb2miZ2UBN7VxM7pomd0MR+0sR+0cTyF7x4rKAmVk4Tq6CJ1dTEHE2soSbWWBProIndpImla2I9NbEBmtggTewpTWyEJjZJE3tZE1uoiS3WxDZrYls1sb2a2H5N7Kgm9oUmdlYT+0ETuxCO+a1HuQpd/LqGmlhjTayDJnaTJpauifXUxAZoYoM0sac0sRGa2CRN7GVNbKEmtlgT26yJbdXE9mpi+zWxo5rYF5rYd5rYD5pYnsIXj12miZXSxMpoYlU1seqaWF1NrL4m1l4Tu14TS9HE0jSxPppYP03scU1suCY2URN7QRObq4nN18TWa2IbNbG3NbHdmtgRTexTTexrTey8JpajyMVjuTSxWE2shCZWRRO7RhOL08Rqa2KNwzG/9ail5rrHNbHhmthETewFTWyuJjZfE1uviW3UxN7WxHZrYkc0sU81sa81sfOaWI6iF4/l0sRiNbESmlgVTewaTSxZE6utibXWxNpqYl00sW6aWG9N7D5N7BFNbJgmNkETe1YTm6mJzdbEVmtiazWxNzSxXZrYYU3sI03sjCZ2ThO7oIllK3bxWFFNLFoTq6yJXamJJWhiSZpYc02spSZ2qybWSRPrpYndrYn118SGamLDwzG/9WiU5ro3NLFdmthhTewjTeyMJnZOE7ugiWWLvnisqCYWrYlV1sSu1MQSNLEkTay5JtZSE7tVE+ukifXSxO7WxB7UxIZqYmM0sXGa2FRNbLomtlwTW6mJvaaJ7dTE3tXE3tfETmhipzSxXzSx3zSxgjEXjxXWxCpoYpU0MUcTC2pijTWxpprYTZpYR02spyZ2hyY2SBMboomN0MRGaWIva2KTNbHFmthSTWydJrZdE9sVjvmtR3s11xWMvXissCZWQROrpIk5mlhQE2usiTXVxG7SxDpqYj01sTs0sUGa2BBNbIQmNkoTe1kTm6yJLdbElmpiWzWx7ZrYfk3soCb2hSZ2TBP7QRP7SRO7rPjFY/k1sTKaWDlNrLomVlMTq6+JNdTErtfEOmhiaZpYuibWTxMboIkN18Se0sRe0MQmaWLzNbGFmthGTWyzJrZbE9uriX2qiR3VxM5rYt9pYr9rYnlKXDxWOBzzW49iNdddr4l10MTSNLF0TayfJjZAExuuiT2lib2giU3SxOZrYgs1sY2a2GZNbLcmtlcT+1QTO6qJndfEvtPEcpW8eCyPJlZCEyuliV2jiVXVxGprYnU1sbaaWHtNrJsmlqKJ3aeJ9dHEhmlij2tiz2piEzWx2ZrYXE1srSa2XhPbpYm9rYl9pIkd0cTOaWJfa2LZSl08lkMTi9bEYjWxKzWxKppYkiaWrIk10sRaa2IdwjG/9ehWzXXPamITNbHZmthcTWytJrZeE9ulib2tiX2kiR3RxM5pYl9rYtlKXzyWQxOL1sRiNbErNbEqmliSJpasibXUxFprYp00sS6a2N2aWG9NbKgm9ogmNk4Tm6CJTdfEZmpiKzWx1ZrYTk3sDU3sfU3ssCZ2ShM7o4n9pold0MQKl7l4rKgmVkkTq6yJBTWxBE2sqSbWXBPrqIndqondoYn10sSGaGIPamJPaGJjNLGJ4ZjfevSy5rr3NbHDmtgpTeyMJvabJnZBEytc9uKxoppYJU2ssiYW1MQSNLGmmlhzTayjJnarJnaHJtZLExuiiT2oiY3SxMZoYpM1sama2FJNbLkmtl0Te00TO6iJvauJHdPETmhiP2liv2hi+ctdPFZQEyuniVXQxGpqYo4m1lATa6yJddDEbtLE0jWxnprYAE1skCb2lCY2QhObpIm9rIkt1MQWa2KbNbGtmtibmth+TexwOOa3Hn2que57TexHTZ8/a677VXPd75rrspW/eCxH+Yv3mUtzXR7NdZdpriugiRXS9FlEc10xzXUxmutKaGKlNH2W0VxXTnNdBc11l2tiV2j6vEpz3dWa667VXFddE6up6dPRXBfUXJeguS6kidXS9FlHc109zXUNNNc11sSaavpsrrmupea61prr7tPE+mj67Ke5boDmukGa6x7QxB7S9Pmw5rpHNdc9prluuCb2lKbPEZrrRmmuG6O5brwm9oymz+c01z2vue5FzXUva2KTNX1O1Vw3XXPdTM11czSxeZo+F2iuW6S5bonmuuWa2EpNn6s1163VXLdec90mTWyLps9tmute1Vy3Q3PdR5rYEU2fn2quO6q57gvNdcc1sZOaPk9rrjurue4rzXXnNbHvNH3+oLnuJ811v2iu+10T+7+HHVykz+wVLn5dTs11uTXXXaaJ5df0WVBzXWHNdUU118VoYsU1fZbUXFdac11ZzXUVNLFKmj4ra667UnNdFc1112pi1TR91tBcF9BcF6e5LkETS9L0may5rrbmurqa6xpoYo00fTbRXNdMc10LzXWtNbG2mj7ba667XnNdB811N2tit2j6vE1zXWfNdV0116VoYmmaPtM11/XUXHeH5rq7NLF7NH3eq7nufs11fTXXDdDEBmn6HKK57kHNdUM11z2qiT2m6fMJzXVPaq57WnPdFE1smqbPGZrrZmmum6O5br4mtlDT52LNdUs11y3XXLdKE1uj6XOd5roNmus2aa7bqolt1/T5mua6nZrr3tBc95Ym9o6mzz2a6/Zprjugue5dTex9TZ+HNdd9pLnuiOa6zzSxzzV9fqm57rjmupOa685oYuc0fX6tue685rrvNNf9qIn9rOnzV811v2uu+78Hl13kuhyaWK6KF+8zj+a6yzTX5ddcV0gTK6Lps5jmuhjNdcU115XSxMpo+iynua6C5rpKmuuu0MSu0vR5tea6azXXVdNcV1MTczR9BjXXJWiuS9JcV0sTq6Pps57mugaa6xpprmuqiTXX9NlSc11rzXVtNdelaWLpmj57aq67Q3NdL81192hi92r6vF9zXV/Ndf011w3SxIZo+nxQc91QzXWPaK57TBN7QtPnk5rrntZcN1Jz3RhNbJymzwma657VXDdRc92LmthLmj5f0Vw3RXPdNM11MzWx2Zo+52qum6+5bqHmuiWa2DJNnys0163SXLdGc916TWyjps/Nmuu2aq7brrluhyb2uqbPNzXXvaW57h3NdXs1sf2aPg9qrntXc937mus+1MQ+1vT5iea6zzTXfa657pgmdkLT5ynNdWc0153TXPeNJvatps/vNdf9qLnuZ811v2liFzR9Zqt08etyVLr4dbk01+XVxPJp+iygua6Q5roimuuu0sSu1vR5rea6aprramiuczSxoKbPBM11SZrrkjXX1dHE6mn6bKC5rpHmuiaa65prYi01fbbWXNdWc117zXU3aGI3avq8WXPdLZrrbtNc10UT66bpM0VzXZrmunTNdbdrYndq+rxLc909muvu1VzXRxPrp+lzgOa6QZrrhmiue0gTe1jT56Oa6x7TXPeE5rqnNLERmj5Haa4bo7lunOa6ZzSx5zR9Pq+57kXNdS9prpusiU3V9Dldc91MzXWzNdfN08QWaPpcpLluiea6ZZrrVmpiqzV9rtVct15z3UbNdVs0sW2aPl/VXLdDc93rmut2aWJva/rcrblur+a6/ZrrTmhipzR9ntFcd05z3dea677VxL7X9Pmj5rqfNdf9qrnugiaW7fKL95nj8otfl0tzXR7Ndfk0sQKaPgtpriuiua6Y5rpYTayEps9SmuvKaK4rp7muoiZ2uabPKzTXXaW57mrNdVU1seqaPmtqrnM01wU11yVqYiFNn7U019XRXFdPc11DTayxps+mmuuaa65rqbmujSbWTtPndZrrbtBcd6Pmuo6a2K2aPjtpruuiua6b5rpUTayHps8MzXW3a667U3Pd3ZpYb02f92mu66O5rp/muoGa2GBNnw9orntIc93DmuuGaWKPa/ocrrnuKc11IzTXjdbExmr6HK+57hnNdc9prpuhic3S9DlHc908zXULNNct1sSWavpcrrlupea61Zrr1mliGzR9btJct0Vz3TbNda9pYjs1fb6huW6X5rq3Ndft0cT2afo8oLnukOa69zTXHdbEPtL0eURz3aea645qrvtSEzuu6fOk5rrTmuvOaq77WhM7r+nzO811P2iu+0lzXaXKF7/u5sr+113mXZvpv7OH/83mthxuaxD+78ClHc5lEf2i+w8F4hMvi/rzAeYPXhbuU1Ifr0+B/gPhx19HNX74j/4zj0UdBcP/nS1CS++avOF4VMS/TSL6y5Yp1tTn/yU5TjcP4r3+cwr07x5x0T783v9L6RP+uon/i2f+uWyZrskRdfF5iPI5l82nn8y6Rs5bg383Zifziczj1I3Ni+XKNFa/cUdenyvqr+POlan/zHMa5fP/yHGRa/36za4Zx/+6NlL7glF/nUePRz3e0qtNOR/+M3+D8PnAJRxJoUDgv9qH+88V9dc8ivz/58r08xXD/50vgj9yHA3+JWdGUoqTEUzJSElI6dEjPi2lWKb+oyI0UzqFP3KZtRbpj6DwWhEnXEN91yK/eqpbizLfc+poEo75rVORa5HXn+Sa7uZBgvA8OdFRF18/lAalIrSJ1DVX1MXXkVyZfjb8texRud1W9CL95db0VzDq4vOrrgt/bepf1i/v3wZRGK38OLL5cBT04fCuYajl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",
1801
+ "debug_symbols": "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0kWrJbpaojWHsmxLRe4da66+nGVHFyuhL5dovYe+astdvZwnDy539XKe3S01h7JsS0XuDQdXaTy3dLES+nKJ1hzKsi0VuXesufpylh1drIS+WqLl5Vy35aYJ/eTB5a5ezrO7peZQlm2xOrh+/OAqjeeWLlZCXy7RmkNZtqUi9441V1/OsqGLd9V4nizR8nKu23LThH7y4HJXL+fZ3WLVllVbKnLvOLhqbGVHFyuhL5dozaEs21KRe8OaK43nli5WQl8t0fJyrtty04R+8uByVy/n2d1ScyjLtlTk3nFw1djKji5WQl8u0ZpDWbXlrl7OvWuuNJ5bulgJfblE6z30ZVusHlwWDy539XKe3S01h7JsS0XuHQdXja3s6GIl9NUSLS/nui0VuTesudJ4buliJfTlErVqy6otN03oJw8ur+PlVInx2w+r/n53+dsrfZ3Q7fJ2q4vHYmN8nWB89kpfJ7yevNIXklaevdLXiZhnr/R1YuDZK32dqHb2Su02r/R1AtXZK32ddzHPXultMtIL+QvPXultMtILWQbPXultMtIL2frOXultMtILOfXOXml9LLx6L65Eduu21MfCGz4WuKv3bnMX62PhxRJtpclbt6U+Fv7xNddKk7eli/Wx8HKJWrVl1Zb6WHjxsXC7q/fu7G6prydYtqUi946Dq77NYEMXS5O3XKKlyVu3pSL3jjVXzo4dXbRaoqslWu+hL9ty04R+8uByV+/d2d1SX0+wbEtF7g0H1129d5u7WAl9tURLk7duS0XuHWvOqosbulgJfblE6z30ZVtumtBPHlzu6r07u1tqDmXVlruK7PYeXHf13m3uYiX05RKtOZRlW6zW3IY1V86OHV2shL5covUe+rItN03oJw8ud/XendwtJbJbt6Ui94aD667eu81drIS+XKJWbVm1pSL3jjVXzo4dXayEvlyi9R76si03TegnDy539d6d3C0lslu3pSL3hoPrrt67zV20WqKrJVpzKMu2VOTesebqy1l2dLES+nKJ1nvoq7bcVZN38uByV+/d2d1ScyjLtlTk3nBw3dV7t7mLldCXS7TmUJZtqci9Y83Vl7Ps6GIl9NUSLU3eui03TegnDy539d6d3S01h7Jsi9XB9eMH1129d5u7WAl9uURrDmXZlorcO9ZcfTnLhi6+kDhw5xJ9Icvg1rbcNKGfPLi8kL9w691i1ZZVWypy7zi4amxlRxcroS+XaM2hLNtSkXvDmnshD+XP7GIl9NUSfSEh5ta23DShnzy4vJBqc+vdUnMoy7ZU5N5xcNXYyo4uVkJfLtGaQ1m0Re7q5dy65qQ0nlu6WAl9uUTrPfRlW6weXD4+uMhdvZxnd0vNoSzbUpF7x8FVYys7ulgJfbVEy8u5bktF7g1rrjSeW7pYCX25RK3asmrLTRP6yYPLXb2cZ3dLzaEs21KRe8fBVWMrG7p4V43nyRItL+e6LRW5d6y5+nKWHV20WqKrJVrvoS/bctOEfvLgclcv59ndUnMoy7ZU5N5wcJXGc0sXK6Gvlmh5Oddtqci9Y81ZdXFDFyuhL5dovYe+bMtNE/rJg8tdvZxnd0vNoazaclcv596DqzSeW7pYCX25RGsOZdkWqzW3Yc3Vl7Ps6GIl9OUSrffQl225aUI/eXC5q5fz5G4pL+e6LRW5NxxcpfHc0sVK6MslatWWVVsqcu9Yc/XlLDu6WAl9uUTrPfRlW26a0E8eXO7q5Ty5W8rLuW5LRe4NB1dpPLd00WqJrpZozaEs21KRe8eaqy9n2dHFSujLJVrvoa/aclcv58mDy+t4OXXe+b/9sOrvd5e/vdLXCd0ub7f6fA/s48b4QvbMs1dqt3mlr5NHz17p60TMs1f6OjHw7JW+TlQ7e6Wvk75OXukLaRTPXunrvIt59kpvk5FeyF949krtNq/0NhnphUyAZ6/0NhnphQR8Z6/0Nhnprt67k/fiSmS3bkt9LLzhY4G7eu82d9Fqia6WaH0svGxLfSy8Y83Vx8I7ulgfCy+XaH0svGiL3lWT9/XHwnpX793Z3VJfT7BsS0XuHz+49LDq4oYuVkJfLtH6eoJlWypy71hz5ezY0cVK6KslWpq8dVtumtBPHlzu6r07u1vq6wmWbbE6uH784Lqr925zFyuhL5dofT3Bsi0VuXesuXJ2bOhiafKWS7Q0eeu23DShnzy43NV7d3a3WLVl1ZaK3DsOrhpb2dHFSujLJVpzKMu2VOTesOZKk7eli5XQV0u0NHnrttw0oZ88uNzVe3d2t9QcyrItFbl3HFw1trKji5XQl0u05lBWbSlN3o41V5q8LV2shL5covUe+rItVg8uiweXu3rvzu6WmkNZtqUi946Dq8ZWdnSxEvpqiZYmb92Witwb1lxp8rZ0sRL6colatWXVlpsm9JMHl7t6787ulppDWbalIveOg6vGVjZ0sTR5yyVamrx1Wypy71hz9eUsO7potURXS7TeQ1+25aYJ/eTB5a7eu7O7peZQlm2pyL3h4Lqr925zFyuhr5boCzn1tralIveONWfVxQ1drIS+XKL1HvqyLTdN6CcPLi/kL9x6t9QcyqotL2RG/IkH1wtZF39mFyuhL5dozaEs22K15jasufpylh1drIS+XKL1HvqyLTdN6CcPLi+k2tx5t5SXc92WitwbDq7SeG7pYiX05RK1asuqLRW5d6y5+nKWHV2shL5covUe+rItN03oXz+42F29nF/fLVZeznVbKnL/+MFlpfHc0kWrJbpaojWHsmxLRe4da66+nGVHFyuhL5dovYe+astdvZwnDy539XKe3S01h7JsS0XuDQdXaTy3dLES+nKJ1hzKsi0VuXesufpylh1drIS+WqLl5Vy35aYJ/eTB5a5ezrO7peZQlm2xOrh+/OAqjeeWLlZCXy7RmkNZtqUi9441V1/OsqGLd9V4nizR8nKu23LThH7y4HJXL+fZ3WLVllVbKnLvOLhqbGVHFyuhL5dozaEs21KRe8OaK43nli5WQl8t0fJyrtty04R+8uByVy/n2d1ScyjLtlTk3nFw1djKji5WQl8u0ZpDWbXlrl7OvWuuNJ5bulgJfblE6z30ZVusHlwWDy539XKe3S01h7JsS0XuHQdXja3s6GIl9NUSLS/nui0VuTesudJ4buliJfTlErVqy6otN03oJw8ur+PlVInx2w+r/n53+dsrfZ3Q7fJ2q4vHYmN8nWB89kpfJ7yevNIXklaevdLXiZhnr/R1YuDZK32dqHb2Su02r/R1AtXZK32ddzHPXultMtIL+QvPXultMtILWQbPXultMtIL2frOXultMtILOfXOXml9LLx6L65Eduu21MfCGz4WuKv3bnMX62Ph1RItTd66LfWx8IY1V5q8LV2sj4WXS9SqLau21MfCq4+F7+q9O7tb6usJlm2pyL3j4KpvM/jxLnpp8lZL1EuTt25LRe4da66cHTu6aLVEV0u03kNftuWmCf3rBxe/q/fu7G6prydYtqUi94aD667eu81drIS+WqKlyVu3pSL3jjVn1cUNXayEvlyi9R76si03TegnDy539d6d3S01h7Jqy11FdnsPrrt67zZ3sRL6conWHMqyLVZrbsOaK2fH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",
1802
+ "brillig_names": [
1803
+ "decompose_hint",
1804
+ "lte_hint",
1805
+ "debug_log_oracle_wrapper",
1806
+ "build_msg_block",
1807
+ "attach_len_to_msg_block",
1808
+ "emit_encrypted_event_log_oracle_wrapper",
1809
+ "directive_integer_quotient",
1810
+ "directive_invert",
1811
+ "directive_to_radix"
1812
+ ],
1813
+ "verification_key": "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",
1814
+ "artifact_hash": "d1d0c528060396c74580edf277211c1c94bdf0b8-94edc11ae2c89e886841a4d53fc776a9-mega-honk-true"
1815
+ },
1816
+ {
1817
+ "name": "compute_note_hash_and_optionally_a_nullifier",
1818
+ "is_unconstrained": true,
1819
+ "custom_attributes": [],
1820
+ "abi": {
1821
+ "error_types": {
1822
+ "16957488177269924912": {
1823
+ "error_kind": "fmtstring",
1824
+ "item_types": [],
1825
+ "length": 16
1826
+ },
1827
+ "17843811134343075018": {
1828
+ "error_kind": "string",
1829
+ "string": "Stack too deep"
1830
+ }
1831
+ },
1832
+ "parameters": [
1833
+ {
1834
+ "name": "contract_address",
1835
+ "type": {
1836
+ "fields": [
1837
+ {
1838
+ "name": "inner",
1839
+ "type": {
1840
+ "kind": "field"
1841
+ }
1842
+ }
1843
+ ],
1844
+ "kind": "struct",
1845
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1846
+ },
1847
+ "visibility": "private"
1848
+ },
1849
+ {
1850
+ "name": "nonce",
1851
+ "type": {
1852
+ "kind": "field"
1853
+ },
1854
+ "visibility": "private"
1855
+ },
1856
+ {
1857
+ "name": "storage_slot",
1858
+ "type": {
1859
+ "kind": "field"
1860
+ },
1861
+ "visibility": "private"
1862
+ },
1863
+ {
1864
+ "name": "note_type_id",
1865
+ "type": {
1866
+ "kind": "field"
1867
+ },
1868
+ "visibility": "private"
1869
+ },
1870
+ {
1871
+ "name": "compute_nullifier",
1872
+ "type": {
1873
+ "kind": "boolean"
1874
+ },
1875
+ "visibility": "private"
1876
+ },
1877
+ {
1878
+ "name": "serialized_note",
1879
+ "type": {
1880
+ "kind": "array",
1881
+ "length": 0,
1882
+ "type": {
1883
+ "kind": "field"
1884
+ }
1885
+ },
1886
+ "visibility": "private"
1887
+ }
1888
+ ],
1889
+ "return_type": {
1890
+ "abi_type": {
1891
+ "kind": "array",
1892
+ "length": 4,
1893
+ "type": {
1894
+ "kind": "field"
1895
+ }
1896
+ },
1897
+ "visibility": "public"
1898
+ }
1899
+ },
1900
+ "bytecode": "H4sIAAAAAAAA/9VZ23LaMBAV2AbshIRA0kIfM9O3dsYO5pI3ZnrJd7hJ+IJ+gB/60n51o0FrHy+bDMGrB3aGke2Vzh6dlSzJdMzOBi+/jrsOXdkz+0Z1Nq5M21mmiJX65Nk5EZ7dE+EZnAjPUJFnR+BpS5pvkdnNub7Zzcc9Jza2iQ7Ab94CYkH/uTJ2ZRf8ionJYqGzWvjrNH+MTdOU+c9jh9n3g78g/IEf/JR4fytrfOwLxQ1c+VDWWj5AG2tDd42DmHDJ1wXfd+YLwPeD+XAM/2Q+HPfEiXTrQV8Ux9Xad16ob33oW+eV0phaO3xGWifG6xjNKOcx48P5E58h1SlrPj3mC8EXM18EPtLflrdQj+e+D/W+wnM+JgOzP4bJTzlHrX2MqdAD/ovlku48J2HZjI0+1D0EPW+ZPj7WCtTHh/5Wn8kr/OnaWr80lQVMT9SINBtgfeaLwReWzTiJuw8hDmIRj4jV/+LuL13ZgzbUfiTE77H4Dd7CM9SIYwXCM6pv5+Rnd31mduPnD9U3++8pvU318l56Z+vhr6q9QOyH/zPhJ17w8wr/DPA11zTCP/ejz5Lwh37wq73YhRf8u0qfS8A3evpntC7S/McYFPvKS+6z7JA9C8ZPGFdfe5Yrxofrg+uj9Y0FriPBx+foWIgzFuJQHias/Ual38utxHVyJFcJ60IRK1bEOraPlI9r1n7j7tNWtsolrteK/R4qYg0UsY4dJ5SPG9Z+4+7TVrYU83Gj2G/NfJwrYvUVsTTnraZelEdprbO2cWXa0jhXPM9hTFrnI1b/N+P5Adoorsl3tKZ9NLXx/cDUU+xD9wMUfyjwId6J4GvzUfb512KR3RerLEu3y3xe5XPKuPJneCayv5lQX9pbkNafjBetU+ncPwNdrYXgmzJfBD7iKJ37Z574H6I/xh8JPjzTvCeXY9Mcazgf+XnVGL13CI136du8dM7U/OZ86Nyk+Anjqsznze+LqA/fqycC15Hg42tfIsRJhDiniMW/0aOGdo6QTmFZ+7VyuVrXf3DRuygyze/+hsWPWP2/7h77RmWbd/52VWTbebEtFsXTU/5YjBm+tS7o9B+RfvSPFR8AAA==",
1901
+ "debug_symbols": "tdnNioMwFEDhd8nahalJ7k1fZRiKbdMiiIo/A4P47hNLhynT9dkI0XgU8Vvd1VzTebmfmu7WT+b4sZq2v9Rz03d5tW6FOY9N2zb30+tpU+4HFx77p6Hu9uU01+NsjtWhMKm7mqMr8923pk35nMhWvO2U35371edOr9tnYZxgZcXKkSr7EitbrHzAyhVWdljZY2XMoMcMesygxwwGzGDADAbMYMAMBsxgwAwGzGDADAbMYMAMCmZQMIOCGRTMoGAGBTMomEHBDApmUDCDihlUzKBiBhUzqJhBxQwqZlAxg4oZVMxgxAxGzGDEDEbMYMQMRsxgxAxGzGDEDEbMoC1LLm259IFLV1zacWnPpQOXFi6tXJrTaDmNltNoOY2W02g5jRbSuOXVVz029blNz7HGbekuL1OO+XtI/wYew9hf0nUZ0z76+Jt67B+2coVzj186L2x+P1tJfkh+0A8=",
1902
+ "brillig_names": [
1903
+ "compute_note_hash_and_optionally_a_nullifier"
1904
+ ]
1905
+ },
1906
+ {
1907
+ "name": "sync_notes",
1908
+ "is_unconstrained": true,
1909
+ "custom_attributes": [],
1910
+ "abi": {
1911
+ "error_types": {
1912
+ "17843811134343075018": {
1913
+ "error_kind": "string",
1914
+ "string": "Stack too deep"
1915
+ }
1916
+ },
1917
+ "parameters": [],
1918
+ "return_type": null
1919
+ },
1920
+ "bytecode": "H4sIAAAAAAAA/9VUyw6CMBBseURBOaiJ3kz8gyIYOJJ49x8akKMe8OKNT5eabbqpVRKlJkzSbEs3szNlW0oUKESPvAH9tGnIFdhBDCA6aN/tRgFr9hviQKs7JH/O0iQw+BtQ/5OfWtIvIPktnT+bAM+xVfzYi6w77UaIesKWZ/nPbHpe9fhc/MFnh32k1caghm+uIYci3RuYR4Y8iRlRd9prh/eV5YzJei7w++RVO67va/lrWIeafvmOFV/qrDMe1wmv+YFXVVrypcYv4KBzGnMvbGHe1wvY45yo3mjul/J0vZ0b0gNB8gCVxsvQjgYAAA==",
1921
+ "debug_symbols": "ndLBCoQgEAbgd5lzh7TM7FViCSsLQTTMFpbo3deiXdqli14GZvCbOfiv0It2GRupBzNDVa+gTMedNNp365ZAa6VScmyuY0j3gtDxfp643tvZceugynACQvdQ5anXg1TCzyjdHgkgHAqyUJCHAhII8O0FRnB5EkYI+SKUsgORGFTEIBqDygiU3f4+KxD9oCIrftHm2ye3krdKnOkaFt1dwuZek/jL3WRNJ/rFij2Bl/D5WvtbGPu1fvUb",
1922
+ "brillig_names": [
1923
+ "sync_notes"
1924
+ ]
1925
+ }
1926
+ ],
1927
+ "outputs": {
1928
+ "globals": {},
1929
+ "structs": {
1930
+ "events": [
1931
+ {
1932
+ "fields": [
1933
+ {
1934
+ "name": "DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE",
1935
+ "type": {
1936
+ "kind": "field"
1937
+ }
1938
+ },
1939
+ {
1940
+ "name": "address",
1941
+ "type": {
1942
+ "fields": [
1943
+ {
1944
+ "name": "inner",
1945
+ "type": {
1946
+ "kind": "field"
1947
+ }
1948
+ }
1949
+ ],
1950
+ "kind": "struct",
1951
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
1952
+ }
1953
+ },
1954
+ {
1955
+ "name": "version",
1956
+ "type": {
1957
+ "kind": "integer",
1958
+ "sign": "unsigned",
1959
+ "width": 8
1960
+ }
1961
+ },
1962
+ {
1963
+ "name": "salt",
1964
+ "type": {
1965
+ "kind": "field"
1966
+ }
1967
+ },
1968
+ {
1969
+ "name": "contract_class_id",
1970
+ "type": {
1971
+ "fields": [
1972
+ {
1973
+ "name": "inner",
1974
+ "type": {
1975
+ "kind": "field"
1976
+ }
1977
+ }
1978
+ ],
1979
+ "kind": "struct",
1980
+ "path": "aztec::protocol_types::contract_class_id::ContractClassId"
1981
+ }
1982
+ },
1983
+ {
1984
+ "name": "initialization_hash",
1985
+ "type": {
1986
+ "kind": "field"
1987
+ }
1988
+ },
1989
+ {
1990
+ "name": "public_keys",
1991
+ "type": {
1992
+ "fields": [
1993
+ {
1994
+ "name": "npk_m",
1995
+ "type": {
1996
+ "fields": [
1997
+ {
1998
+ "name": "inner",
1999
+ "type": {
2000
+ "fields": [
2001
+ {
2002
+ "name": "x",
2003
+ "type": {
2004
+ "kind": "field"
2005
+ }
2006
+ },
2007
+ {
2008
+ "name": "y",
2009
+ "type": {
2010
+ "kind": "field"
2011
+ }
2012
+ },
2013
+ {
2014
+ "name": "is_infinite",
2015
+ "type": {
2016
+ "kind": "boolean"
2017
+ }
2018
+ }
2019
+ ],
2020
+ "kind": "struct",
2021
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
2022
+ }
2023
+ }
2024
+ ],
2025
+ "kind": "struct",
2026
+ "path": "aztec::protocol_types::public_keys::NpkM"
2027
+ }
2028
+ },
2029
+ {
2030
+ "name": "ivpk_m",
2031
+ "type": {
2032
+ "fields": [
2033
+ {
2034
+ "name": "inner",
2035
+ "type": {
2036
+ "fields": [
2037
+ {
2038
+ "name": "x",
2039
+ "type": {
2040
+ "kind": "field"
2041
+ }
2042
+ },
2043
+ {
2044
+ "name": "y",
2045
+ "type": {
2046
+ "kind": "field"
2047
+ }
2048
+ },
2049
+ {
2050
+ "name": "is_infinite",
2051
+ "type": {
2052
+ "kind": "boolean"
2053
+ }
2054
+ }
2055
+ ],
2056
+ "kind": "struct",
2057
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
2058
+ }
2059
+ }
2060
+ ],
2061
+ "kind": "struct",
2062
+ "path": "aztec::protocol_types::public_keys::IvpkM"
2063
+ }
2064
+ },
2065
+ {
2066
+ "name": "ovpk_m",
2067
+ "type": {
2068
+ "fields": [
2069
+ {
2070
+ "name": "inner",
2071
+ "type": {
2072
+ "fields": [
2073
+ {
2074
+ "name": "x",
2075
+ "type": {
2076
+ "kind": "field"
2077
+ }
2078
+ },
2079
+ {
2080
+ "name": "y",
2081
+ "type": {
2082
+ "kind": "field"
2083
+ }
2084
+ },
2085
+ {
2086
+ "name": "is_infinite",
2087
+ "type": {
2088
+ "kind": "boolean"
2089
+ }
2090
+ }
2091
+ ],
2092
+ "kind": "struct",
2093
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
2094
+ }
2095
+ }
2096
+ ],
2097
+ "kind": "struct",
2098
+ "path": "aztec::protocol_types::public_keys::OvpkM"
2099
+ }
2100
+ },
2101
+ {
2102
+ "name": "tpk_m",
2103
+ "type": {
2104
+ "fields": [
2105
+ {
2106
+ "name": "inner",
2107
+ "type": {
2108
+ "fields": [
2109
+ {
2110
+ "name": "x",
2111
+ "type": {
2112
+ "kind": "field"
2113
+ }
2114
+ },
2115
+ {
2116
+ "name": "y",
2117
+ "type": {
2118
+ "kind": "field"
2119
+ }
2120
+ },
2121
+ {
2122
+ "name": "is_infinite",
2123
+ "type": {
2124
+ "kind": "boolean"
2125
+ }
2126
+ }
2127
+ ],
2128
+ "kind": "struct",
2129
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
2130
+ }
2131
+ }
2132
+ ],
2133
+ "kind": "struct",
2134
+ "path": "aztec::protocol_types::public_keys::TpkM"
2135
+ }
2136
+ }
2137
+ ],
2138
+ "kind": "struct",
2139
+ "path": "aztec::protocol_types::public_keys::PublicKeys"
2140
+ }
2141
+ },
2142
+ {
2143
+ "name": "deployer",
2144
+ "type": {
2145
+ "fields": [
2146
+ {
2147
+ "name": "inner",
2148
+ "type": {
2149
+ "kind": "field"
2150
+ }
2151
+ }
2152
+ ],
2153
+ "kind": "struct",
2154
+ "path": "aztec::protocol_types::address::aztec_address::AztecAddress"
2155
+ }
2156
+ }
2157
+ ],
2158
+ "kind": "struct",
2159
+ "path": "ContractInstanceDeployer::ContractInstanceDeployed"
2160
+ }
2161
+ ],
2162
+ "functions": [
2163
+ {
2164
+ "fields": [
2165
+ {
2166
+ "name": "parameters",
2167
+ "type": {
2168
+ "fields": [
2169
+ {
2170
+ "name": "salt",
2171
+ "type": {
2172
+ "kind": "field"
2173
+ }
2174
+ },
2175
+ {
2176
+ "name": "contract_class_id",
2177
+ "type": {
2178
+ "fields": [
2179
+ {
2180
+ "name": "inner",
2181
+ "type": {
2182
+ "kind": "field"
2183
+ }
2184
+ }
2185
+ ],
2186
+ "kind": "struct",
2187
+ "path": "aztec::protocol_types::contract_class_id::ContractClassId"
2188
+ }
2189
+ },
2190
+ {
2191
+ "name": "initialization_hash",
2192
+ "type": {
2193
+ "kind": "field"
2194
+ }
2195
+ },
2196
+ {
2197
+ "name": "public_keys",
2198
+ "type": {
2199
+ "fields": [
2200
+ {
2201
+ "name": "npk_m",
2202
+ "type": {
2203
+ "fields": [
2204
+ {
2205
+ "name": "inner",
2206
+ "type": {
2207
+ "fields": [
2208
+ {
2209
+ "name": "x",
2210
+ "type": {
2211
+ "kind": "field"
2212
+ }
2213
+ },
2214
+ {
2215
+ "name": "y",
2216
+ "type": {
2217
+ "kind": "field"
2218
+ }
2219
+ },
2220
+ {
2221
+ "name": "is_infinite",
2222
+ "type": {
2223
+ "kind": "boolean"
2224
+ }
2225
+ }
2226
+ ],
2227
+ "kind": "struct",
2228
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
2229
+ }
2230
+ }
2231
+ ],
2232
+ "kind": "struct",
2233
+ "path": "aztec::protocol_types::public_keys::NpkM"
2234
+ }
2235
+ },
2236
+ {
2237
+ "name": "ivpk_m",
2238
+ "type": {
2239
+ "fields": [
2240
+ {
2241
+ "name": "inner",
2242
+ "type": {
2243
+ "fields": [
2244
+ {
2245
+ "name": "x",
2246
+ "type": {
2247
+ "kind": "field"
2248
+ }
2249
+ },
2250
+ {
2251
+ "name": "y",
2252
+ "type": {
2253
+ "kind": "field"
2254
+ }
2255
+ },
2256
+ {
2257
+ "name": "is_infinite",
2258
+ "type": {
2259
+ "kind": "boolean"
2260
+ }
2261
+ }
2262
+ ],
2263
+ "kind": "struct",
2264
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
2265
+ }
2266
+ }
2267
+ ],
2268
+ "kind": "struct",
2269
+ "path": "aztec::protocol_types::public_keys::IvpkM"
2270
+ }
2271
+ },
2272
+ {
2273
+ "name": "ovpk_m",
2274
+ "type": {
2275
+ "fields": [
2276
+ {
2277
+ "name": "inner",
2278
+ "type": {
2279
+ "fields": [
2280
+ {
2281
+ "name": "x",
2282
+ "type": {
2283
+ "kind": "field"
2284
+ }
2285
+ },
2286
+ {
2287
+ "name": "y",
2288
+ "type": {
2289
+ "kind": "field"
2290
+ }
2291
+ },
2292
+ {
2293
+ "name": "is_infinite",
2294
+ "type": {
2295
+ "kind": "boolean"
2296
+ }
2297
+ }
2298
+ ],
2299
+ "kind": "struct",
2300
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
2301
+ }
2302
+ }
2303
+ ],
2304
+ "kind": "struct",
2305
+ "path": "aztec::protocol_types::public_keys::OvpkM"
2306
+ }
2307
+ },
2308
+ {
2309
+ "name": "tpk_m",
2310
+ "type": {
2311
+ "fields": [
2312
+ {
2313
+ "name": "inner",
2314
+ "type": {
2315
+ "fields": [
2316
+ {
2317
+ "name": "x",
2318
+ "type": {
2319
+ "kind": "field"
2320
+ }
2321
+ },
2322
+ {
2323
+ "name": "y",
2324
+ "type": {
2325
+ "kind": "field"
2326
+ }
2327
+ },
2328
+ {
2329
+ "name": "is_infinite",
2330
+ "type": {
2331
+ "kind": "boolean"
2332
+ }
2333
+ }
2334
+ ],
2335
+ "kind": "struct",
2336
+ "path": "std::embedded_curve_ops::EmbeddedCurvePoint"
2337
+ }
2338
+ }
2339
+ ],
2340
+ "kind": "struct",
2341
+ "path": "aztec::protocol_types::public_keys::TpkM"
2342
+ }
2343
+ }
2344
+ ],
2345
+ "kind": "struct",
2346
+ "path": "aztec::protocol_types::public_keys::PublicKeys"
2347
+ }
2348
+ },
2349
+ {
2350
+ "name": "universal_deploy",
2351
+ "type": {
2352
+ "kind": "boolean"
2353
+ }
2354
+ }
2355
+ ],
2356
+ "kind": "struct",
2357
+ "path": "ContractInstanceDeployer::deploy_parameters"
2358
+ }
2359
+ }
2360
+ ],
2361
+ "kind": "struct",
2362
+ "path": "ContractInstanceDeployer::deploy_abi"
2363
+ }
2364
+ ]
2365
+ }
2366
+ },
2367
+ "file_map": {
2368
+ "24": {
2369
+ "path": "std/embedded_curve_ops.nr",
2370
+ "source": "use crate::cmp::Eq;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul<let N: u32>(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n let point_array = multi_scalar_mul_array_return(points, scalars);\n EmbeddedCurvePoint { x: point_array[0], y: point_array[1], is_infinite: point_array[2] as bool }\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return<let N: u32>(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [Field; 3] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n let g1 = EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860,\n is_infinite: false,\n };\n multi_scalar_mul([g1], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// This is a hack because returning an `EmbeddedCurvePoint` from a foreign function in brillig returns a [BrilligVariable::SingleAddr; 2] rather than BrilligVariable::BrilligArray\n// as is defined in the brillig bytecode format. This is a workaround which allows us to fix this without modifying the serialization format.\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n let x_coordinates_match = point1.x == point2.x;\n let y_coordinates_match = point1.y == point2.y;\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n result.is_infinite = x_coordinates_match;\n\n // dbl if x_match, y_match\n let double = embedded_curve_add_unsafe(point1, point1);\n result = if double_predicate { double } else { result };\n\n // infinity if x_match, !y_match\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n let mut result_is_infinity = infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [Field; 3] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n let point_array = embedded_curve_add_array_return(point1, point2);\n let x = point_array[0];\n let y = point_array[1];\n\n EmbeddedCurvePoint { x, y, is_infinite: false }\n}\n"
2371
+ },
2372
+ "25": {
2373
+ "path": "std/field/bn254.nr",
2374
+ "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\nglobal TWO_POW_64: Field = 0x10000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(mut x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 64 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low_lower_64 = (x as u64) as Field;\n x = (x - low_lower_64) / TWO_POW_64;\n let low_upper_64 = (x as u64) as Field;\n\n let high = (x - low_upper_64) / TWO_POW_64;\n let low = low_upper_64 * TWO_POW_64 + low_lower_64;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(unsafe { field_less_than(b, a) });\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n"
2375
+ },
2376
+ "26": {
2377
+ "path": "std/field/mod.nr",
2378
+ "source": "pub mod bn254;\nuse crate::runtime::is_unconstrained;\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size<let BIT_SIZE: u32>(self) {\n // docs:end:assert_max_bit_size\n assert(BIT_SIZE < modulus_num_bits() as u32);\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n // docs:start:to_le_bits\n pub fn to_le_bits<let N: u32>(self: Self) -> [u1; N] {}\n // docs:end:to_le_bits\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n // docs:start:to_be_bits\n pub fn to_be_bits<let N: u32>(self: Self) -> [u1; N] {}\n // docs:end:to_be_bits\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes<let N: u32>(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes<let N: u32>(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix<let N: u32>(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix<let N: u32>(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix<let N: u32>(self, radix: u32) -> [u8; N] {}\n\n #[builtin(to_be_radix)]\n fn __to_be_radix<let N: u32>(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes<let N: u32>(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes<let N: u32>(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n"
2379
+ },
2380
+ "33": {
2381
+ "path": "std/hash/poseidon2.nr",
2382
+ "source": "use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n if message_size == N {\n Poseidon2::hash_internal(input, N, false)\n } else {\n Poseidon2::hash_internal(input, message_size, true)\n }\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal<let N: u32>(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n"
2383
+ },
2384
+ "34": {
2385
+ "path": "std/hash/sha256.nr",
2386
+ "source": "use crate::runtime::is_unconstrained;\n\n// Implementation of SHA-256 mapping a byte array of variable length to\n// 32 bytes.\n\n// A message block is up to 64 bytes taken from the input.\nglobal BLOCK_SIZE = 64;\n\n// The first index in the block where the 8 byte message size will be written.\nglobal MSG_SIZE_PTR = 56;\n\n// Size of the message block when packed as 4-byte integer array.\nglobal INT_BLOCK_SIZE = 16;\n\n// A `u32` integer consists of 4 bytes.\nglobal INT_SIZE = 4;\n\n// Index of the integer in the `INT_BLOCK` where the length is written.\nglobal INT_SIZE_PTR = MSG_SIZE_PTR / INT_SIZE;\n\n// Magic numbers for bit shifting.\n// Works with actual bit shifting as well as the compiler turns them into * and /\n// but circuit execution appears to be 10% faster this way.\nglobal TWO_POW_8 = 256;\nglobal TWO_POW_16 = TWO_POW_8 * 256;\nglobal TWO_POW_24 = TWO_POW_16 * 256;\nglobal TWO_POW_32 = TWO_POW_24 as u64 * 256;\n\n// Index of a byte in a 64 byte block; ie. 0..=63\ntype BLOCK_BYTE_PTR = u32;\n\n// The foreign function to compress blocks works on 16 pieces of 4-byte integers, instead of 64 bytes.\ntype INT_BLOCK = [u32; INT_BLOCK_SIZE];\n\n// A message block is a slice of the original message of a fixed size,\n// potentially padded with zeros, with neighbouring 4 bytes packed into integers.\ntype MSG_BLOCK = INT_BLOCK;\n\n// The hash is 32 bytes.\ntype HASH = [u8; 32];\n\n// The state accumulates the blocks.\n// Its overall size is the same as the `HASH`.\ntype STATE = [u32; 8];\n\n// Deprecated in favour of `sha256_var`\n// docs:start:sha256\npub fn sha256<let N: u32>(input: [u8; N]) -> HASH\n// docs:end:sha256\n{\n digest(input)\n}\n\n#[foreign(sha256_compression)]\npub fn sha256_compression(_input: INT_BLOCK, _state: STATE) -> STATE {}\n\n// SHA-256 hash function\n#[no_predicates]\npub fn digest<let N: u32>(msg: [u8; N]) -> HASH {\n sha256_var(msg, N as u64)\n}\n\n// Variable size SHA-256 hash\npub fn sha256_var<let N: u32>(msg: [u8; N], message_size: u64) -> HASH {\n let message_size = message_size as u32;\n let num_blocks = N / BLOCK_SIZE;\n let mut msg_block: MSG_BLOCK = [0; INT_BLOCK_SIZE];\n // Intermediate hash, starting with the canonical initial value\n let mut h: STATE = [\n 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635,\n 1541459225,\n ];\n // Pointer into msg_block on a 64 byte scale\n let mut msg_byte_ptr = 0;\n for i in 0..num_blocks {\n let msg_start = BLOCK_SIZE * i;\n let (new_msg_block, new_msg_byte_ptr) =\n unsafe { build_msg_block(msg, message_size, msg_start) };\n\n if msg_start < message_size {\n msg_block = new_msg_block;\n }\n\n if !is_unconstrained() {\n // Verify the block we are compressing was appropriately constructed\n let new_msg_byte_ptr = verify_msg_block(msg, message_size, msg_block, msg_start);\n if msg_start < message_size {\n msg_byte_ptr = new_msg_byte_ptr;\n }\n } else if msg_start < message_size {\n msg_byte_ptr = new_msg_byte_ptr;\n }\n\n // If the block is filled, compress it.\n // An un-filled block is handled after this loop.\n if (msg_start < message_size) & (msg_byte_ptr == BLOCK_SIZE) {\n h = sha256_compression(msg_block, h);\n }\n }\n\n let modulo = N % BLOCK_SIZE;\n // Handle setup of the final msg block.\n // This case is only hit if the msg is less than the block size,\n // or our message cannot be evenly split into blocks.\n if modulo != 0 {\n let msg_start = BLOCK_SIZE * num_blocks;\n let (new_msg_block, new_msg_byte_ptr) =\n unsafe { build_msg_block(msg, message_size, msg_start) };\n\n if msg_start < message_size {\n msg_block = new_msg_block;\n }\n\n if !is_unconstrained() {\n let new_msg_byte_ptr = verify_msg_block(msg, message_size, msg_block, msg_start);\n if msg_start < message_size {\n msg_byte_ptr = new_msg_byte_ptr;\n verify_msg_block_padding(msg_block, msg_byte_ptr);\n }\n } else if msg_start < message_size {\n msg_byte_ptr = new_msg_byte_ptr;\n }\n }\n\n // If we had modulo == 0 then it means the last block was full,\n // and we can reset the pointer to zero to overwrite it.\n if msg_byte_ptr == BLOCK_SIZE {\n msg_byte_ptr = 0;\n }\n\n // Pad the rest such that we have a [u32; 2] block at the end representing the length\n // of the message, and a block of 1 0 ... 0 following the message (i.e. [1 << 7, 0, ..., 0]).\n // Here we rely on the fact that everything beyond the available input is set to 0.\n msg_block = update_block_item(\n msg_block,\n msg_byte_ptr,\n |msg_item| set_item_byte_then_zeros(msg_item, msg_byte_ptr, 1 << 7),\n );\n msg_byte_ptr = msg_byte_ptr + 1;\n let last_block = msg_block;\n\n // If we don't have room to write the size, compress the block and reset it.\n if msg_byte_ptr > MSG_SIZE_PTR {\n h = sha256_compression(msg_block, h);\n // `attach_len_to_msg_block` will zero out everything after the `msg_byte_ptr`.\n msg_byte_ptr = 0;\n }\n\n msg_block = unsafe { attach_len_to_msg_block(msg_block, msg_byte_ptr, message_size) };\n\n if !is_unconstrained() {\n verify_msg_len(msg_block, last_block, msg_byte_ptr, message_size);\n }\n\n hash_final_block(msg_block, h)\n}\n\n// Take `BLOCK_SIZE` number of bytes from `msg` starting at `msg_start`.\n// Returns the block and the length that has been copied rather than padded with zeros.\nunconstrained fn build_msg_block<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n msg_start: u32,\n) -> (MSG_BLOCK, BLOCK_BYTE_PTR) {\n let mut msg_block: MSG_BLOCK = [0; INT_BLOCK_SIZE];\n\n // We insert `BLOCK_SIZE` bytes (or up to the end of the message)\n let block_input = if msg_start + BLOCK_SIZE > message_size {\n if message_size < msg_start {\n // This function is sometimes called with `msg_start` past the end of the message.\n // In this case we return an empty block and zero pointer to signal that the result should be ignored.\n 0\n } else {\n message_size - msg_start\n }\n } else {\n BLOCK_SIZE\n };\n\n // Figure out the number of items in the int array that we have to pack.\n // e.g. if the input is [0,1,2,3,4,5] then we need to pack it as 2 items: [0123, 4500]\n let mut int_input = block_input / INT_SIZE;\n if block_input % INT_SIZE != 0 {\n int_input = int_input + 1;\n };\n\n for i in 0..int_input {\n let mut msg_item: u32 = 0;\n // Always construct the integer as 4 bytes, even if it means going beyond the input.\n for j in 0..INT_SIZE {\n let k = i * INT_SIZE + j;\n let msg_byte = if k < block_input {\n msg[msg_start + k]\n } else {\n 0\n };\n msg_item = lshift8(msg_item, 1) + msg_byte as u32;\n }\n msg_block[i] = msg_item;\n }\n\n // Returning the index as if it was a 64 byte array.\n // We have to project it down to 16 items and bit shifting to get a byte back if we need it.\n (msg_block, block_input)\n}\n\n// Verify the block we are compressing was appropriately constructed by `build_msg_block`\n// and matches the input data. Returns the index of the first unset item.\n// If `message_size` is less than `msg_start` then this is called with the old non-empty block;\n// in that case we can skip verification, ie. no need to check that everything is zero.\nfn verify_msg_block<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n msg_block: MSG_BLOCK,\n msg_start: u32,\n) -> BLOCK_BYTE_PTR {\n let mut msg_byte_ptr = 0;\n let mut msg_end = msg_start + BLOCK_SIZE;\n if msg_end > N {\n msg_end = N;\n }\n // We might have to go beyond the input to pad the fields.\n if msg_end % INT_SIZE != 0 {\n msg_end = msg_end + INT_SIZE - msg_end % INT_SIZE;\n }\n\n // Reconstructed packed item.\n let mut msg_item: u32 = 0;\n\n // Inclusive at the end so that we can compare the last item.\n let mut i: u32 = 0;\n for k in msg_start..=msg_end {\n if k % INT_SIZE == 0 {\n // If we consumed some input we can compare against the block.\n if (msg_start < message_size) & (k > msg_start) {\n assert_eq(msg_block[i], msg_item as u32);\n i = i + 1;\n msg_item = 0;\n }\n }\n // Shift the accumulator\n msg_item = lshift8(msg_item, 1);\n // If we have input to consume, add it at the rightmost position.\n if k < message_size & k < msg_end {\n msg_item = msg_item + msg[k] as u32;\n msg_byte_ptr = msg_byte_ptr + 1;\n }\n }\n\n msg_byte_ptr\n}\n\n// Verify the block we are compressing was appropriately padded with zeros by `build_msg_block`.\n// This is only relevant for the last, potentially partially filled block.\nfn verify_msg_block_padding(msg_block: MSG_BLOCK, msg_byte_ptr: BLOCK_BYTE_PTR) {\n // Check all the way to the end of the block.\n verify_msg_block_zeros(msg_block, msg_byte_ptr, INT_BLOCK_SIZE);\n}\n\n// Verify that a region of ints in the message block are (partially) zeroed,\n// up to an (exclusive) maximum which can either be the end of the block\n// or just where the size is to be written.\nfn verify_msg_block_zeros(\n msg_block: MSG_BLOCK,\n mut msg_byte_ptr: BLOCK_BYTE_PTR,\n max_int_byte_ptr: u32,\n) {\n // This variable is used to get around the compiler under-constrained check giving a warning.\n // We want to check against a constant zero, but if it does not come from the circuit inputs\n // or return values the compiler check will issue a warning.\n let zero = msg_block[0] - msg_block[0];\n\n // First integer which is supposed to be (partially) zero.\n let mut int_byte_ptr = msg_byte_ptr / INT_SIZE;\n\n // Check partial zeros.\n let modulo = msg_byte_ptr % INT_SIZE;\n if modulo != 0 {\n let zeros = INT_SIZE - modulo;\n let mask = if zeros == 3 {\n TWO_POW_24\n } else if zeros == 2 {\n TWO_POW_16\n } else {\n TWO_POW_8\n };\n assert_eq(msg_block[int_byte_ptr] % mask, zero);\n int_byte_ptr = int_byte_ptr + 1;\n }\n\n // Check the rest of the items.\n for i in 0..max_int_byte_ptr {\n if i >= int_byte_ptr {\n assert_eq(msg_block[i], zero);\n }\n }\n}\n\n// Verify that up to the byte pointer the two blocks are equal.\n// At the byte pointer the new block can be partially zeroed.\nfn verify_msg_block_equals_last(\n msg_block: MSG_BLOCK,\n last_block: MSG_BLOCK,\n mut msg_byte_ptr: BLOCK_BYTE_PTR,\n) {\n // msg_byte_ptr is the position at which they are no longer have to be the same.\n // First integer which is supposed to be (partially) zero contains that pointer.\n let mut int_byte_ptr = msg_byte_ptr / INT_SIZE;\n\n // Check partial zeros.\n let modulo = msg_byte_ptr % INT_SIZE;\n if modulo != 0 {\n // Reconstruct the partially zero item from the last block.\n let last_field = last_block[int_byte_ptr];\n let mut msg_item: u32 = 0;\n // Reset to where they are still equal.\n msg_byte_ptr = msg_byte_ptr - modulo;\n for i in 0..INT_SIZE {\n msg_item = lshift8(msg_item, 1);\n if i < modulo {\n msg_item = msg_item + get_item_byte(last_field, msg_byte_ptr) as u32;\n msg_byte_ptr = msg_byte_ptr + 1;\n }\n }\n assert_eq(msg_block[int_byte_ptr], msg_item);\n }\n\n for i in 0..INT_SIZE_PTR {\n if i < int_byte_ptr {\n assert_eq(msg_block[i], last_block[i]);\n }\n }\n}\n\n// Apply a function on the block item which the pointer indicates.\nfn update_block_item<Env>(\n mut msg_block: MSG_BLOCK,\n msg_byte_ptr: BLOCK_BYTE_PTR,\n f: fn[Env](u32) -> u32,\n) -> MSG_BLOCK {\n let i = msg_byte_ptr / INT_SIZE;\n msg_block[i] = f(msg_block[i]);\n msg_block\n}\n\n// Set the rightmost `zeros` number of bytes to 0.\nfn set_item_zeros(item: u32, zeros: u8) -> u32 {\n lshift8(rshift8(item, zeros), zeros)\n}\n\n// Replace one byte in the item with a value, and set everything after it to zero.\nfn set_item_byte_then_zeros(msg_item: u32, msg_byte_ptr: BLOCK_BYTE_PTR, msg_byte: u8) -> u32 {\n let zeros = INT_SIZE - msg_byte_ptr % INT_SIZE;\n let zeroed_item = set_item_zeros(msg_item, zeros as u8);\n let new_item = byte_into_item(msg_byte, msg_byte_ptr);\n zeroed_item + new_item\n}\n\n// Get a byte of a message item according to its overall position in the `BLOCK_SIZE` space.\nfn get_item_byte(mut msg_item: u32, msg_byte_ptr: BLOCK_BYTE_PTR) -> u8 {\n // How many times do we have to shift to the right to get to the position we want?\n let max_shifts = INT_SIZE - 1;\n let shifts = max_shifts - msg_byte_ptr % INT_SIZE;\n msg_item = rshift8(msg_item, shifts as u8);\n // At this point the byte we want is in the rightmost position.\n msg_item as u8\n}\n\n// Project a byte into a position in a field based on the overall block pointer.\n// For example putting 1 into pointer 5 would be 100, because overall we would\n// have [____, 0100] with indexes [0123,4567].\nfn byte_into_item(msg_byte: u8, msg_byte_ptr: BLOCK_BYTE_PTR) -> u32 {\n let mut msg_item = msg_byte as u32;\n // How many times do we have to shift to the left to get to the position we want?\n let max_shifts = INT_SIZE - 1;\n let shifts = max_shifts - msg_byte_ptr % INT_SIZE;\n lshift8(msg_item, shifts as u8)\n}\n\n// Construct a field out of 4 bytes.\nfn make_item(b0: u8, b1: u8, b2: u8, b3: u8) -> u32 {\n let mut item = b0 as u32;\n item = lshift8(item, 1) + b1 as u32;\n item = lshift8(item, 1) + b2 as u32;\n item = lshift8(item, 1) + b3 as u32;\n item\n}\n\n// Shift by 8 bits to the left between 0 and 4 times.\n// Checks `is_unconstrained()` to just use a bitshift if we're running in an unconstrained context,\n// otherwise multiplies by 256.\nfn lshift8(item: u32, shifts: u8) -> u32 {\n if is_unconstrained() {\n if item == 0 {\n 0\n } else {\n // Brillig wouldn't shift 0<<4 without overflow.\n item << (8 * shifts)\n }\n } else {\n // We can do a for loop up to INT_SIZE or an if-else.\n if shifts == 0 {\n item\n } else if shifts == 1 {\n item * TWO_POW_8\n } else if shifts == 2 {\n item * TWO_POW_16\n } else if shifts == 3 {\n item * TWO_POW_24\n } else {\n // Doesn't make sense, but it's most likely called on 0 anyway.\n 0\n }\n }\n}\n\n// Shift by 8 bits to the right between 0 and 4 times.\n// Checks `is_unconstrained()` to just use a bitshift if we're running in an unconstrained context,\n// otherwise divides by 256.\nfn rshift8(item: u32, shifts: u8) -> u32 {\n if is_unconstrained() {\n item >> (8 * shifts)\n } else {\n // Division wouldn't work on `Field`.\n if shifts == 0 {\n item\n } else if shifts == 1 {\n item / TWO_POW_8\n } else if shifts == 2 {\n item / TWO_POW_16\n } else if shifts == 3 {\n item / TWO_POW_24\n } else {\n 0\n }\n }\n}\n\n// Zero out all bytes between the end of the message and where the length is appended,\n// then write the length into the last 8 bytes of the block.\nunconstrained fn attach_len_to_msg_block(\n mut msg_block: MSG_BLOCK,\n mut msg_byte_ptr: BLOCK_BYTE_PTR,\n message_size: u32,\n) -> MSG_BLOCK {\n // We assume that `msg_byte_ptr` is less than 57 because if not then it is reset to zero before calling this function.\n // In any case, fill blocks up with zeros until the last 64 bits (i.e. until msg_byte_ptr = 56).\n // There can be one item which has to be partially zeroed.\n let modulo = msg_byte_ptr % INT_SIZE;\n if modulo != 0 {\n // Index of the block in which we find the item we need to partially zero.\n let i = msg_byte_ptr / INT_SIZE;\n let zeros = INT_SIZE - modulo;\n msg_block[i] = set_item_zeros(msg_block[i], zeros as u8);\n msg_byte_ptr = msg_byte_ptr + zeros;\n }\n\n // The rest can be zeroed without bit shifting anything.\n for i in (msg_byte_ptr / INT_SIZE)..INT_SIZE_PTR {\n msg_block[i] = 0;\n }\n\n // Set the last two 4 byte ints as the first/second half of the 8 bytes of the length.\n let len = 8 * message_size;\n let len_bytes: [u8; 8] = (len as Field).to_be_bytes();\n for i in 0..=1 {\n let shift = i * 4;\n msg_block[INT_SIZE_PTR + i] = make_item(\n len_bytes[shift],\n len_bytes[shift + 1],\n len_bytes[shift + 2],\n len_bytes[shift + 3],\n );\n }\n msg_block\n}\n\n// Verify that the message length was correctly written by `attach_len_to_msg_block`,\n// and that everything between the byte pointer and the size pointer was zeroed,\n// and that everything before the byte pointer was untouched.\nfn verify_msg_len(\n msg_block: MSG_BLOCK,\n last_block: MSG_BLOCK,\n msg_byte_ptr: BLOCK_BYTE_PTR,\n message_size: u32,\n) {\n // Check zeros up to the size pointer.\n verify_msg_block_zeros(msg_block, msg_byte_ptr, INT_SIZE_PTR);\n\n // Check that up to the pointer we match the last block.\n verify_msg_block_equals_last(msg_block, last_block, msg_byte_ptr);\n\n // We verify the message length was inserted correctly by reversing the byte decomposition.\n let mut reconstructed_len: u64 = 0;\n for i in INT_SIZE_PTR..INT_BLOCK_SIZE {\n reconstructed_len = reconstructed_len * TWO_POW_32;\n reconstructed_len = reconstructed_len + msg_block[i] as u64;\n }\n let len = 8 * message_size as u64;\n assert_eq(reconstructed_len, len);\n}\n\n// Perform the final compression, then transform the `STATE` into `HASH`.\nfn hash_final_block(msg_block: MSG_BLOCK, mut state: STATE) -> HASH {\n let mut out_h: HASH = [0; 32]; // Digest as sequence of bytes\n // Hash final padded block\n state = sha256_compression(msg_block, state);\n\n // Return final hash as byte array\n for j in 0..8 {\n let h_bytes: [u8; 4] = (state[j] as Field).to_be_bytes();\n for k in 0..4 {\n out_h[4 * j + k] = h_bytes[k];\n }\n }\n\n out_h\n}\n\nmod tests {\n use super::{\n attach_len_to_msg_block, build_msg_block, byte_into_item, get_item_byte, make_item,\n set_item_byte_then_zeros, set_item_zeros,\n };\n use super::INT_BLOCK;\n use super::sha256_var;\n\n #[test]\n fn smoke_test() {\n let input = [0xbd];\n let result = [\n 0x68, 0x32, 0x57, 0x20, 0xaa, 0xbd, 0x7c, 0x82, 0xf3, 0x0f, 0x55, 0x4b, 0x31, 0x3d,\n 0x05, 0x70, 0xc9, 0x5a, 0xcc, 0xbb, 0x7d, 0xc4, 0xb5, 0xaa, 0xe1, 0x12, 0x04, 0xc0,\n 0x8f, 0xfe, 0x73, 0x2b,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_just_over_block() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116,\n ];\n let result = [\n 91, 122, 146, 93, 52, 109, 133, 148, 171, 61, 156, 70, 189, 238, 153, 7, 222, 184, 94,\n 24, 65, 114, 192, 244, 207, 199, 87, 232, 192, 224, 171, 207,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_multiple_over_block() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116, 61, 117, 115, 45, 97, 115,\n 99, 105, 105, 13, 10, 109, 105, 109, 101, 45, 118, 101, 114, 115, 105, 111, 110, 58, 49,\n 46, 48, 32, 40, 77, 97, 99, 32, 79, 83, 32, 88, 32, 77, 97, 105, 108, 32, 49, 54, 46,\n 48, 32, 92, 40, 51, 55, 51, 49, 46, 53, 48, 48, 46, 50, 51, 49, 92, 41, 41, 13, 10, 115,\n 117, 98, 106, 101, 99, 116, 58, 72, 101, 108, 108, 111, 13, 10, 109, 101, 115, 115, 97,\n 103, 101, 45, 105, 100, 58, 60, 56, 70, 56, 49, 57, 68, 51, 50, 45, 66, 54, 65, 67, 45,\n 52, 56, 57, 68, 45, 57, 55, 55, 70, 45, 52, 51, 56, 66, 66, 67, 52, 67, 65, 66, 50, 55,\n 64, 109, 101, 46, 99, 111, 109, 62, 13, 10, 100, 97, 116, 101, 58, 83, 97, 116, 44, 32,\n 50, 54, 32, 65, 117, 103, 32, 50, 48, 50, 51, 32, 49, 50, 58, 50, 53, 58, 50, 50, 32,\n 43, 48, 52, 48, 48, 13, 10, 116, 111, 58, 122, 107, 101, 119, 116, 101, 115, 116, 64,\n 103, 109, 97, 105, 108, 46, 99, 111, 109, 13, 10, 100, 107, 105, 109, 45, 115, 105, 103,\n 110, 97, 116, 117, 114, 101, 58, 118, 61, 49, 59, 32, 97, 61, 114, 115, 97, 45, 115,\n 104, 97, 50, 53, 54, 59, 32, 99, 61, 114, 101, 108, 97, 120, 101, 100, 47, 114, 101,\n 108, 97, 120, 101, 100, 59, 32, 100, 61, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109,\n 59, 32, 115, 61, 49, 97, 49, 104, 97, 105, 59, 32, 116, 61, 49, 54, 57, 51, 48, 51, 56,\n 51, 51, 55, 59, 32, 98, 104, 61, 55, 120, 81, 77, 68, 117, 111, 86, 86, 85, 52, 109, 48,\n 87, 48, 87, 82, 86, 83, 114, 86, 88, 77, 101, 71, 83, 73, 65, 83, 115, 110, 117, 99, 75,\n 57, 100, 74, 115, 114, 99, 43, 118, 85, 61, 59, 32, 104, 61, 102, 114, 111, 109, 58, 67,\n 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 77, 105, 109, 101, 45, 86, 101,\n 114, 115, 105, 111, 110, 58, 83, 117, 98, 106, 101, 99,\n ];\n let result = [\n 116, 90, 151, 31, 78, 22, 138, 180, 211, 189, 69, 76, 227, 200, 155, 29, 59, 123, 154,\n 60, 47, 153, 203, 129, 157, 251, 48, 2, 79, 11, 65, 47,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_just_under_block() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59,\n ];\n let result = [\n 143, 140, 76, 173, 222, 123, 102, 68, 70, 149, 207, 43, 39, 61, 34, 79, 216, 252, 213,\n 165, 74, 16, 110, 74, 29, 64, 138, 167, 30, 1, 9, 119,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_big_not_block_multiple() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116, 61, 117, 115, 45, 97, 115,\n 99, 105, 105, 13, 10, 109, 105, 109, 101, 45, 118, 101, 114, 115, 105, 111, 110, 58, 49,\n 46, 48, 32, 40, 77, 97, 99, 32, 79, 83, 32, 88, 32, 77, 97, 105, 108, 32, 49, 54, 46,\n 48, 32, 92, 40, 51, 55, 51, 49, 46, 53, 48, 48, 46, 50, 51, 49, 92, 41, 41, 13, 10, 115,\n 117, 98, 106, 101, 99, 116, 58, 72, 101, 108, 108, 111, 13, 10, 109, 101, 115, 115, 97,\n 103, 101, 45, 105, 100, 58, 60, 56, 70, 56, 49, 57, 68, 51, 50, 45, 66, 54, 65, 67, 45,\n 52, 56, 57, 68, 45, 57, 55, 55, 70, 45, 52, 51, 56, 66, 66, 67, 52, 67, 65, 66, 50, 55,\n 64, 109, 101, 46, 99, 111, 109, 62, 13, 10, 100, 97, 116, 101, 58, 83, 97, 116, 44, 32,\n 50, 54, 32, 65, 117, 103, 32, 50, 48, 50, 51, 32, 49, 50, 58, 50, 53, 58, 50, 50, 32,\n 43, 48, 52, 48, 48, 13, 10, 116, 111, 58, 122, 107, 101, 119, 116, 101, 115, 116, 64,\n 103, 109, 97, 105, 108, 46, 99, 111, 109, 13, 10, 100, 107, 105, 109, 45, 115, 105, 103,\n 110, 97, 116, 117, 114, 101, 58, 118, 61, 49, 59, 32, 97, 61, 114, 115, 97, 45, 115,\n 104, 97, 50, 53, 54, 59, 32, 99, 61, 114, 101, 108, 97, 120, 101, 100, 47, 114, 101,\n 108, 97, 120, 101, 100, 59, 32, 100, 61, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109,\n 59, 32, 115, 61, 49, 97, 49, 104, 97, 105, 59, 32, 116, 61, 49, 54, 57, 51, 48, 51, 56,\n 51, 51, 55, 59, 32, 98, 104, 61, 55, 120, 81, 77, 68, 117, 111, 86, 86, 85, 52, 109, 48,\n 87, 48, 87, 82, 86, 83, 114, 86, 88, 77, 101, 71, 83, 73, 65, 83, 115, 110, 117, 99, 75,\n 57, 100, 74, 115, 114, 99, 43, 118, 85, 61, 59, 32, 104, 61, 102, 114, 111, 109, 58, 67,\n 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 77, 105, 109, 101, 45, 86, 101,\n 114, 115, 105, 111, 110, 58, 83, 117, 98, 106, 101, 99, 116, 58, 77, 101, 115, 115, 97,\n 103, 101, 45, 73, 100, 58, 68, 97, 116, 101, 58, 116, 111, 59, 32, 98, 61,\n ];\n let result = [\n 112, 144, 73, 182, 208, 98, 9, 238, 54, 229, 61, 145, 222, 17, 72, 62, 148, 222, 186,\n 55, 192, 82, 220, 35, 66, 47, 193, 200, 22, 38, 26, 186,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn msg_big_with_padding() {\n let input = [\n 48, 130, 1, 37, 2, 1, 0, 48, 11, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 1, 48, 130, 1, 17,\n 48, 37, 2, 1, 1, 4, 32, 176, 223, 31, 133, 108, 84, 158, 102, 70, 11, 165, 175, 196, 12,\n 201, 130, 25, 131, 46, 125, 156, 194, 28, 23, 55, 133, 157, 164, 135, 136, 220, 78, 48,\n 37, 2, 1, 2, 4, 32, 190, 82, 180, 235, 222, 33, 79, 50, 152, 136, 142, 35, 116, 224, 6,\n 242, 156, 141, 128, 248, 10, 61, 98, 86, 248, 45, 207, 210, 90, 232, 175, 38, 48, 37, 2,\n 1, 3, 4, 32, 0, 194, 104, 108, 237, 246, 97, 230, 116, 198, 69, 110, 26, 87, 17, 89,\n 110, 199, 108, 250, 36, 21, 39, 87, 110, 102, 250, 213, 174, 131, 171, 174, 48, 37, 2,\n 1, 11, 4, 32, 136, 155, 87, 144, 111, 15, 152, 127, 85, 25, 154, 81, 20, 58, 51, 75,\n 193, 116, 234, 0, 60, 30, 29, 30, 183, 141, 72, 247, 255, 203, 100, 124, 48, 37, 2, 1,\n 12, 4, 32, 41, 234, 106, 78, 31, 11, 114, 137, 237, 17, 92, 71, 134, 47, 62, 78, 189,\n 233, 201, 214, 53, 4, 47, 189, 201, 133, 6, 121, 34, 131, 64, 142, 48, 37, 2, 1, 13, 4,\n 32, 91, 222, 210, 193, 62, 222, 104, 82, 36, 41, 138, 253, 70, 15, 148, 208, 156, 45,\n 105, 171, 241, 195, 185, 43, 217, 162, 146, 201, 222, 89, 238, 38, 48, 37, 2, 1, 14, 4,\n 32, 76, 123, 216, 13, 51, 227, 72, 245, 59, 193, 238, 166, 103, 49, 23, 164, 171, 188,\n 194, 197, 156, 187, 249, 28, 198, 95, 69, 15, 182, 56, 54, 38, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n ];\n let result = [\n 32, 85, 108, 174, 127, 112, 178, 182, 8, 43, 134, 123, 192, 211, 131, 66, 184, 240, 212,\n 181, 240, 180, 106, 195, 24, 117, 54, 129, 19, 10, 250, 53,\n ];\n let message_size = 297;\n assert_eq(sha256_var(input, message_size), result);\n }\n\n #[test]\n fn msg_big_no_padding() {\n let input = [\n 48, 130, 1, 37, 2, 1, 0, 48, 11, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 1, 48, 130, 1, 17,\n 48, 37, 2, 1, 1, 4, 32, 176, 223, 31, 133, 108, 84, 158, 102, 70, 11, 165, 175, 196, 12,\n 201, 130, 25, 131, 46, 125, 156, 194, 28, 23, 55, 133, 157, 164, 135, 136, 220, 78, 48,\n 37, 2, 1, 2, 4, 32, 190, 82, 180, 235, 222, 33, 79, 50, 152, 136, 142, 35, 116, 224, 6,\n 242, 156, 141, 128, 248, 10, 61, 98, 86, 248, 45, 207, 210, 90, 232, 175, 38, 48, 37, 2,\n 1, 3, 4, 32, 0, 194, 104, 108, 237, 246, 97, 230, 116, 198, 69, 110, 26, 87, 17, 89,\n 110, 199, 108, 250, 36, 21, 39, 87, 110, 102, 250, 213, 174, 131, 171, 174, 48, 37, 2,\n 1, 11, 4, 32, 136, 155, 87, 144, 111, 15, 152, 127, 85, 25, 154, 81, 20, 58, 51, 75,\n 193, 116, 234, 0, 60, 30, 29, 30, 183, 141, 72, 247, 255, 203, 100, 124, 48, 37, 2, 1,\n 12, 4, 32, 41, 234, 106, 78, 31, 11, 114, 137, 237, 17, 92, 71, 134, 47, 62, 78, 189,\n 233, 201, 214, 53, 4, 47, 189, 201, 133, 6, 121, 34, 131, 64, 142, 48, 37, 2, 1, 13, 4,\n 32, 91, 222, 210, 193, 62, 222, 104, 82, 36, 41, 138, 253, 70, 15, 148, 208, 156, 45,\n 105, 171, 241, 195, 185, 43, 217, 162, 146, 201, 222, 89, 238, 38, 48, 37, 2, 1, 14, 4,\n 32, 76, 123, 216, 13, 51, 227, 72, 245, 59, 193, 238, 166, 103, 49, 23, 164, 171, 188,\n 194, 197, 156, 187, 249, 28, 198, 95, 69, 15, 182, 56, 54, 38,\n ];\n let result = [\n 32, 85, 108, 174, 127, 112, 178, 182, 8, 43, 134, 123, 192, 211, 131, 66, 184, 240, 212,\n 181, 240, 180, 106, 195, 24, 117, 54, 129, 19, 10, 250, 53,\n ];\n assert_eq(sha256_var(input, input.len() as u64), result);\n }\n\n #[test]\n fn same_msg_len_variable_padding() {\n let input = [\n 29, 81, 165, 84, 243, 114, 101, 37, 242, 146, 127, 99, 69, 145, 39, 72, 213, 39, 253,\n 179, 218, 37, 217, 201, 172, 93, 198, 50, 249, 70, 15, 30, 162, 112, 187, 40, 140, 9,\n 236, 53, 32, 44, 38, 163, 113, 254, 192, 197, 44, 89, 71, 130, 169, 242, 17, 211, 214,\n 72, 19, 178, 186, 168, 147, 127, 99, 101, 252, 227, 8, 147, 150, 85, 97, 158, 17, 107,\n 218, 244, 82, 113, 247, 91, 208, 214, 60, 244, 87, 137, 173, 201, 130, 18, 66, 56, 198,\n 149, 207, 189, 175, 120, 123, 224, 177, 167, 251, 159, 143, 110, 68, 183, 189, 70, 126,\n 32, 35, 164, 44, 30, 44, 12, 65, 18, 62, 239, 242, 2, 248, 104, 2, 178, 64, 28, 126, 36,\n 137, 24, 14, 116, 91, 98, 90, 159, 218, 102, 45, 11, 110, 223, 245, 184, 52, 99, 59,\n 245, 136, 175, 3, 72, 164, 146, 145, 116, 22, 66, 24, 49, 193, 121, 3, 60, 37, 41, 97,\n 3, 190, 66, 195, 225, 63, 46, 3, 118, 4, 208, 15, 1, 40, 254, 235, 151, 123, 70, 180,\n 170, 44, 172, 90, 4, 254, 53, 239, 116, 246, 67, 56, 129, 61, 22, 169, 213, 65, 27, 216,\n 116, 162, 239, 214, 207, 126, 177, 20, 100, 25, 48, 143, 84, 215, 70, 197, 53, 65, 70,\n 86, 172, 61, 62, 9, 212, 167, 169, 133, 41, 126, 213, 196, 33, 192, 238, 0, 63, 246,\n 215, 58, 128, 110, 101, 92, 3, 170, 214, 130, 149, 52, 81, 125, 118, 233, 3, 118, 193,\n 104, 207, 120, 115, 77, 253, 191, 122, 0, 107, 164, 207, 113, 81, 169, 36, 201, 228, 74,\n 134, 131, 218, 178, 35, 30, 216, 101, 2, 103, 174, 87, 95, 50, 50, 215, 157, 5, 210,\n 188, 54, 211, 78, 45, 199, 96, 121, 241, 241, 176, 226, 194, 134, 130, 89, 217, 210,\n 186, 32, 140, 39, 91, 103, 212, 26, 87, 32, 72, 144, 228, 230, 117, 99, 188, 50, 15, 69,\n 79, 179, 50, 12, 106, 86, 218, 101, 73, 142, 243, 29, 250, 122, 228, 233, 29, 255, 22,\n 121, 114, 125, 103, 41, 250, 241, 179, 126, 158, 198, 116, 209, 65, 94, 98, 228, 175,\n 169, 96, 3, 9, 233, 133, 214, 55, 161, 164, 103, 80, 85, 24, 186, 64, 167, 92, 131, 53,\n 101, 202, 47, 25, 104, 118, 155, 14, 12, 12, 25, 116, 45, 221, 249, 28, 246, 212, 200,\n 157, 167, 169, 56, 197, 181, 4, 245, 146, 1, 140, 234, 191, 212, 228, 125, 87, 81, 86,\n 119, 30, 63, 129, 143, 32, 96,\n ];\n\n // Prepare inputs of different lengths\n let mut input_511 = [0; 511];\n let mut input_512 = [0; 512]; // Next block\n let mut input_575 = [0; 575];\n let mut input_576 = [0; 576]; // Next block\n for i in 0..input.len() {\n input_511[i] = input[i];\n input_512[i] = input[i];\n input_575[i] = input[i];\n input_576[i] = input[i];\n }\n\n // Compute hashes of all inputs (with same message length)\n let fixed_length_hash = super::sha256(input);\n let var_full_length_hash = sha256_var(input, input.len() as u64);\n let var_length_hash_511 = sha256_var(input_511, input.len() as u64);\n let var_length_hash_512 = sha256_var(input_512, input.len() as u64);\n let var_length_hash_575 = sha256_var(input_575, input.len() as u64);\n let var_length_hash_576 = sha256_var(input_576, input.len() as u64);\n\n // All of the above should have produced the same hash\n assert_eq(var_full_length_hash, fixed_length_hash);\n assert_eq(var_length_hash_511, fixed_length_hash);\n assert_eq(var_length_hash_512, fixed_length_hash);\n assert_eq(var_length_hash_575, fixed_length_hash);\n assert_eq(var_length_hash_576, fixed_length_hash);\n }\n\n #[test]\n fn test_get_item_byte() {\n let fld = make_item(10, 20, 30, 40);\n assert_eq(fld, 0x0a141e28);\n assert_eq(get_item_byte(fld, 0), 10);\n assert_eq(get_item_byte(fld, 4), 10);\n assert_eq(get_item_byte(fld, 6), 30);\n }\n\n #[test]\n fn test_byte_into_item() {\n let fld = make_item(0, 20, 0, 0);\n assert_eq(byte_into_item(20, 1), fld);\n assert_eq(byte_into_item(20, 5), fld);\n }\n\n #[test]\n fn test_set_item_zeros() {\n let fld0 = make_item(10, 20, 30, 40);\n let fld1 = make_item(10, 0, 0, 0);\n assert_eq(set_item_zeros(fld0, 3), fld1);\n assert_eq(set_item_zeros(fld0, 4), 0);\n assert_eq(set_item_zeros(0, 4), 0);\n }\n\n #[test]\n fn test_set_item_byte_then_zeros() {\n let fld0 = make_item(10, 20, 30, 40);\n let fld1 = make_item(10, 50, 0, 0);\n assert_eq(set_item_byte_then_zeros(fld0, 1, 50), fld1);\n }\n\n #[test]\n fn test_build_msg_block_start_0() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48,\n ];\n assert_eq(input.len(), 22);\n let (msg_block, msg_byte_ptr) = unsafe { build_msg_block(input, input.len(), 0) };\n assert_eq(msg_byte_ptr, input.len());\n assert_eq(msg_block[0], make_item(input[0], input[1], input[2], input[3]));\n assert_eq(msg_block[1], make_item(input[4], input[5], input[6], input[7]));\n assert_eq(msg_block[5], make_item(input[20], input[21], 0, 0));\n assert_eq(msg_block[6], 0);\n }\n\n #[test]\n fn test_build_msg_block_start_1() {\n let input = [\n 102, 114, 111, 109, 58, 114, 117, 110, 110, 105, 101, 114, 46, 108, 101, 97, 103, 117,\n 101, 115, 46, 48, 106, 64, 105, 99, 108, 111, 117, 100, 46, 99, 111, 109, 13, 10, 99,\n 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 116, 101, 120, 116, 47, 112,\n 108, 97, 105, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116,\n ];\n assert_eq(input.len(), 68);\n let (msg_block, msg_byte_ptr) = unsafe { build_msg_block(input, input.len(), 64) };\n assert_eq(msg_byte_ptr, 4);\n assert_eq(msg_block[0], make_item(input[64], input[65], input[66], input[67]));\n assert_eq(msg_block[1], 0);\n }\n\n #[test]\n fn test_attach_len_to_msg_block() {\n let input: INT_BLOCK = [\n 2152555847, 1397309779, 1936618851, 1262052426, 1936876331, 1985297723, 543702374,\n 1919905082, 1131376244, 1701737517, 1417244773, 978151789, 1697470053, 1920166255,\n 1849316213, 1651139939,\n ];\n let msg_block = unsafe { attach_len_to_msg_block(input, 1, 448) };\n assert_eq(msg_block[0], ((1 << 7) as u32) * 256 * 256 * 256);\n assert_eq(msg_block[1], 0);\n assert_eq(msg_block[15], 3584);\n }\n}\n"
2387
+ },
2388
+ "58": {
2389
+ "path": "std/panic.nr",
2390
+ "source": "pub fn panic<T, U, let N: u32>(message: fmtstr<N, T>) -> U {\n assert(false, message);\n crate::mem::zeroed()\n}\n"
2391
+ },
2392
+ "89": {
2393
+ "path": "/usr/src/noir-projects/aztec-nr/aztec/src/utils/to_bytes.nr",
2394
+ "source": "pub fn arr_to_be_bytes_arr<let L: u32>(fields: [Field; L]) -> [u8; L * 32] {\n let mut bytes = [0 as u8; L * 32];\n for i in 0..L {\n // Note that bytes.append() results in bound error\n let to_add: [u8; 32] = fields[i].to_be_bytes();\n for j in 0..32 {\n bytes[i * 32 + j] = to_add[j];\n }\n }\n bytes\n}\n\n// each character of a string is converted into a byte\n// then an ACVM field via the oracle => we recreate here\npub fn str_to_be_bytes_arr<let L: u32>(string: str<L>) -> [u8; L * 32] {\n let chars_bytes: [u8; L] = string.as_bytes();\n let mut bytes = [0 as u8; L * 32];\n for i in 0..L {\n let to_add: [u8; 32] = (chars_bytes[i] as Field).to_be_bytes();\n for j in 0..32 {\n bytes[i * 32 + j] = to_add[j];\n }\n }\n bytes\n}\n"
2395
+ },
2396
+ "102": {
2397
+ "path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/logs.nr",
2398
+ "source": "use dep::protocol_types::address::AztecAddress;\n\n/// Informs the simulator that an encrypted note log has been emitted, helping it keep track of side-effects and easing\n/// debugging.\npub fn emit_encrypted_note_log<let M: u32>(\n note_hash_counter: u32,\n encrypted_note: [u8; M],\n counter: u32,\n) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n emit_encrypted_note_log_oracle_wrapper(note_hash_counter, encrypted_note, counter)\n }\n}\n\n/// Informs the simulator that an encrypted event log has been emitted, helping it keep track of side-effects and easing\n/// debugging.\npub fn emit_encrypted_event_log<let M: u32>(\n contract_address: AztecAddress,\n randomness: Field,\n encrypted_event: [u8; M],\n counter: u32,\n) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n emit_encrypted_event_log_oracle_wrapper(\n contract_address,\n randomness,\n encrypted_event,\n counter,\n )\n }\n}\n\nunconstrained fn emit_encrypted_note_log_oracle_wrapper<let M: u32>(\n note_hash_counter: u32,\n encrypted_note: [u8; M],\n counter: u32,\n) {\n emit_encrypted_note_log_oracle(note_hash_counter, encrypted_note, counter)\n}\n\nunconstrained fn emit_encrypted_event_log_oracle_wrapper<let M: u32>(\n contract_address: AztecAddress,\n randomness: Field,\n encrypted_event: [u8; M],\n counter: u32,\n) {\n emit_encrypted_event_log_oracle(contract_address, randomness, encrypted_event, counter)\n}\n\n/// Temporary substitute that is used for handling contract class registration. This\n/// variant returns the log hash, which would be too large to compute inside a circuit.\npub unconstrained fn emit_contract_class_unencrypted_log_private<let N: u32>(\n contract_address: AztecAddress,\n message: [Field; N],\n counter: u32,\n) -> Field {\n emit_contract_class_unencrypted_log_private_oracle(contract_address, message, counter)\n}\n\n// = 480 + 32 * N bytes\n#[oracle(emitEncryptedNoteLog)]\nunconstrained fn emit_encrypted_note_log_oracle<let M: u32>(\n _note_hash_counter: u32,\n _encrypted_note: [u8; M],\n _counter: u32,\n) {}\n\n#[oracle(emitEncryptedEventLog)]\nunconstrained fn emit_encrypted_event_log_oracle<let M: u32>(\n _contract_address: AztecAddress,\n _randomness: Field,\n _encrypted_event: [u8; M],\n _counter: u32,\n) {}\n\n#[oracle(emitContractClassLog)]\nunconstrained fn emit_contract_class_unencrypted_log_private_oracle<let N: u32>(\n contract_address: AztecAddress,\n message: [Field; N],\n counter: u32,\n) -> Field {}\n"
2399
+ },
2400
+ "109": {
2401
+ "path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/notes.nr",
2402
+ "source": "use crate::note::{note_header::NoteHeader, note_interface::NoteInterface};\n\nuse dep::protocol_types::{\n address::AztecAddress,\n indexed_tagging_secret::{INDEXED_TAGGING_SECRET_LENGTH, IndexedTaggingSecret},\n utils::arr_copy_slice,\n};\n\n/// Notifies the simulator that a note has been created, so that it can be returned in future read requests in the same\n/// transaction. This note should only be added to the non-volatile database if found in an actual block.\npub fn notify_created_note<let N: u32>(\n storage_slot: Field,\n note_type_id: Field,\n serialized_note: [Field; N],\n note_hash: Field,\n counter: u32,\n) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n notify_created_note_oracle_wrapper(\n storage_slot,\n note_type_id,\n serialized_note,\n note_hash,\n counter,\n )\n };\n}\n\n/// Notifies the simulator that a note has been nullified, so that it is no longer returned in future read requests in\n/// the same transaction. This note should only be removed to the non-volatile database if its nullifier is found in an\n/// actual block.\npub fn notify_nullified_note(nullifier: Field, note_hash: Field, counter: u32) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe { notify_nullified_note_oracle_wrapper(nullifier, note_hash, counter) };\n}\n\nunconstrained fn notify_created_note_oracle_wrapper<let N: u32>(\n storage_slot: Field,\n note_type_id: Field,\n serialized_note: [Field; N],\n note_hash: Field,\n counter: u32,\n) {\n let _ = notify_created_note_oracle(\n storage_slot,\n note_type_id,\n serialized_note,\n note_hash,\n counter,\n );\n}\n\n#[oracle(notifyCreatedNote)]\nunconstrained fn notify_created_note_oracle<let N: u32>(\n _storage_slot: Field,\n _note_type_id: Field,\n _serialized_note: [Field; N],\n _note_hash: Field,\n _counter: u32,\n) -> Field {}\n\nunconstrained fn notify_nullified_note_oracle_wrapper(\n nullifier: Field,\n note_hash: Field,\n counter: u32,\n) {\n let _ = notify_nullified_note_oracle(nullifier, note_hash, counter);\n}\n\n#[oracle(notifyNullifiedNote)]\nunconstrained fn notify_nullified_note_oracle(\n _nullifier: Field,\n _note_hash: Field,\n _counter: u32,\n) -> Field {}\n\n#[oracle(getNotes)]\nunconstrained fn get_notes_oracle<let N: u32, let S: u32>(\n _storage_slot: Field,\n _num_selects: u8,\n _select_by_indexes: [u8; N],\n _select_by_offsets: [u8; N],\n _select_by_lengths: [u8; N],\n _select_values: [Field; N],\n _select_comparators: [u8; N],\n _sort_by_indexes: [u8; N],\n _sort_by_offsets: [u8; N],\n _sort_by_lengths: [u8; N],\n _sort_order: [u8; N],\n _limit: u32,\n _offset: u32,\n _status: u8,\n _return_size: u32,\n _placeholder_fields: [Field; S],\n) -> [Field; S] {}\n\nunconstrained fn get_notes_oracle_wrapper<let N: u32, let S: u32>(\n storage_slot: Field,\n num_selects: u8,\n select_by_indexes: [u8; N],\n select_by_offsets: [u8; N],\n select_by_lengths: [u8; N],\n select_values: [Field; N],\n select_comparators: [u8; N],\n sort_by_indexes: [u8; N],\n sort_by_offsets: [u8; N],\n sort_by_lengths: [u8; N],\n sort_order: [u8; N],\n limit: u32,\n offset: u32,\n status: u8,\n mut placeholder_fields: [Field; S],\n) -> [Field; S] {\n let return_size = placeholder_fields.len() as u32;\n get_notes_oracle(\n storage_slot,\n num_selects,\n select_by_indexes,\n select_by_offsets,\n select_by_lengths,\n select_values,\n select_comparators,\n sort_by_indexes,\n sort_by_offsets,\n sort_by_lengths,\n sort_order,\n limit,\n offset,\n status,\n return_size,\n placeholder_fields,\n )\n}\n\npub unconstrained fn get_notes<Note, let N: u32, let M: u32, let S: u32, let NS: u32>(\n storage_slot: Field,\n num_selects: u8,\n select_by_indexes: [u8; M],\n select_by_offsets: [u8; M],\n select_by_lengths: [u8; M],\n select_values: [Field; M],\n select_comparators: [u8; M],\n sort_by_indexes: [u8; M],\n sort_by_offsets: [u8; M],\n sort_by_lengths: [u8; M],\n sort_order: [u8; M],\n limit: u32,\n offset: u32,\n status: u8,\n mut placeholder_opt_notes: [Option<Note>; S], // TODO: Remove it and use `limit` to initialize the note array.\n placeholder_fields: [Field; NS], // TODO: Remove it and use `limit` to initialize the note array.\n _placeholder_note_length: [Field; N], // Turbofish hack? Compiler breaks calculating read_offset unless we add this parameter\n) -> [Option<Note>; S]\nwhere\n Note: NoteInterface<N>,\n{\n sync_notes_oracle_wrapper();\n let fields = get_notes_oracle_wrapper(\n storage_slot,\n num_selects,\n select_by_indexes,\n select_by_offsets,\n select_by_lengths,\n select_values,\n select_comparators,\n sort_by_indexes,\n sort_by_offsets,\n sort_by_lengths,\n sort_order,\n limit,\n offset,\n status,\n placeholder_fields,\n );\n let num_notes = fields[0] as u32;\n let contract_address = AztecAddress::from_field(fields[1]);\n for i in 0..placeholder_opt_notes.len() {\n if i < num_notes {\n // lengths named as per typescript.\n let return_header_length: u32 = 2; // num_notes & contract_address.\n let extra_preimage_length: u32 = 2; // nonce & note_hash_counter.\n let read_offset: u32 = return_header_length + i * (N + extra_preimage_length);\n let nonce = fields[read_offset];\n let note_hash_counter = fields[read_offset + 1] as u32;\n let header = NoteHeader { contract_address, nonce, storage_slot, note_hash_counter };\n let serialized_note = arr_copy_slice(fields, [0; N], read_offset + 2);\n let mut note = Note::deserialize_content(serialized_note);\n note.set_header(header);\n placeholder_opt_notes[i] = Option::some(note);\n };\n }\n placeholder_opt_notes\n}\n\n/// Returns true if the nullifier exists. Note that a `true` value can be constrained by proving existence of the\n/// nullifier, but a `false` value should not be relied upon since other transactions may emit this nullifier before the\n/// current transaction is included in a block. While this might seem of little use at first, certain design patterns\n/// benefit from this abstraction (see e.g. `PrivateMutable`).\npub unconstrained fn check_nullifier_exists(inner_nullifier: Field) -> bool {\n check_nullifier_exists_oracle(inner_nullifier) == 1\n}\n\n#[oracle(checkNullifierExists)]\nunconstrained fn check_nullifier_exists_oracle(_inner_nullifier: Field) -> Field {}\n\n/// Same as `get_app_tagging_secret_as_sender`, except it returns the derived tag as an array of bytes, ready to be included in a\n/// log.\npub unconstrained fn get_app_tag_bytes_as_sender(\n sender: AztecAddress,\n recipient: AztecAddress,\n) -> [u8; 32] {\n let tag = get_app_tagging_secret_as_sender(sender, recipient).compute_tag(recipient);\n tag.to_be_bytes()\n}\n\n/// Returns the tagging secret for a given sender and recipient pair, siloed for the current contract address.\n/// Includes the last known index used to send a note tagged with this secret.\n/// For this to work, PXE must know the ivpsk_m of the sender.\n/// For the recipient's side, only the address is needed.\npub unconstrained fn get_app_tagging_secret_as_sender(\n sender: AztecAddress,\n recipient: AztecAddress,\n) -> IndexedTaggingSecret {\n let result = get_app_tagging_secret_as_sender_oracle(sender, recipient);\n IndexedTaggingSecret::deserialize(result)\n}\n\n#[oracle(getAppTaggingSecretAsSender)]\nunconstrained fn get_app_tagging_secret_as_sender_oracle(\n _sender: AztecAddress,\n _recipient: AztecAddress,\n) -> [Field; INDEXED_TAGGING_SECRET_LENGTH] {}\n\n/// Notifies the simulator that a tag has been used in a note, and to therefore increment the associated index so that\n/// future notes get a different tag and can be discovered by the recipient.\n/// This change should only be persisted in a non-volatile database if the tagged log is found in an actual block -\n/// otherwise e.g. a reverting transaction can cause the sender to accidentally skip indices and later produce notes\n/// that are not found by the recipient.\npub fn increment_app_tagging_secret_index_as_sender(sender: AztecAddress, recipient: AztecAddress) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n increment_app_tagging_secret_index_as_sender_wrapper(sender, recipient);\n }\n}\n\nunconstrained fn increment_app_tagging_secret_index_as_sender_wrapper(\n sender: AztecAddress,\n recipient: AztecAddress,\n) {\n increment_app_tagging_secret_index_as_sender_oracle(sender, recipient);\n}\n\n#[oracle(incrementAppTaggingSecretIndexAsSender)]\nunconstrained fn increment_app_tagging_secret_index_as_sender_oracle(\n _sender: AztecAddress,\n _recipient: AztecAddress,\n) {}\n\n/// Finds new notes that may have been sent to all registered accounts in PXE in the current contract and makes them available\n/// for later querying via the `get_notes` oracle.\npub fn sync_notes() {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n sync_notes_oracle_wrapper();\n }\n}\n\nunconstrained fn sync_notes_oracle_wrapper() {\n sync_notes_oracle();\n}\n\n#[oracle(syncNotes)]\nunconstrained fn sync_notes_oracle() {}\n"
2403
+ },
2404
+ "119": {
2405
+ "path": "/usr/src/noir-projects/aztec-nr/aztec/src/hash.nr",
2406
+ "source": "use crate::utils::to_bytes::{arr_to_be_bytes_arr, str_to_be_bytes_arr};\nuse dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n constants::{\n GENERATOR_INDEX__FUNCTION_ARGS, GENERATOR_INDEX__MESSAGE_NULLIFIER,\n GENERATOR_INDEX__SECRET_HASH,\n },\n hash::{poseidon2_hash_with_separator, poseidon2_hash_with_separator_slice, sha256_to_field},\n point::Point,\n traits::Hash,\n};\n\npub use dep::protocol_types::hash::{compute_siloed_nullifier, pedersen_hash};\n\npub fn pedersen_commitment<let N: u32>(inputs: [Field; N], hash_index: u32) -> Point {\n std::hash::pedersen_commitment_with_separator(inputs, hash_index)\n}\n\npub fn compute_secret_hash(secret: Field) -> Field {\n poseidon2_hash_with_separator([secret], GENERATOR_INDEX__SECRET_HASH)\n}\n\npub fn compute_unencrypted_log_hash<let N: u32>(\n contract_address: AztecAddress,\n log: [u8; N],\n) -> Field {\n let mut hash_bytes = [0; N + 36];\n // Address is converted to 32 bytes in ts\n let address_bytes: [u8; 32] = contract_address.to_field().to_be_bytes();\n for i in 0..32 {\n hash_bytes[i] = address_bytes[i];\n }\n let len_bytes: [u8; 4] = (N as Field).to_be_bytes();\n for i in 0..4 {\n hash_bytes[32 + i] = len_bytes[i];\n }\n for i in 0..N {\n hash_bytes[36 + i] = log[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\npub fn compute_l1_to_l2_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field,\n leaf_index: Field,\n) -> Field {\n let mut hash_bytes = [0 as u8; 224];\n let sender_bytes: [u8; 32] = sender.to_field().to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n let recipient_bytes: [u8; 32] = recipient.to_field().to_be_bytes();\n let version_bytes: [u8; 32] = version.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let secret_hash_bytes: [u8; 32] = secret_hash.to_be_bytes();\n let leaf_index_bytes: [u8; 32] = leaf_index.to_be_bytes();\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n hash_bytes[i + 192] = leaf_index_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret\npub fn compute_l1_to_l2_message_nullifier(message_hash: Field, secret: Field) -> Field {\n poseidon2_hash_with_separator([message_hash, secret], GENERATOR_INDEX__MESSAGE_NULLIFIER)\n}\n\npub struct ArgsHasher {\n pub fields: [Field],\n}\n\nimpl Hash for ArgsHasher {\n fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n\nimpl ArgsHasher {\n pub fn new() -> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<let N: u32>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n}\n\npub fn hash_args_array<let N: u32>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\npub fn hash_args(args: [Field]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator_slice(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n#[test]\nunconstrained fn compute_var_args_hash() {\n let mut input = ArgsHasher::new();\n for i in 0..100 {\n input.add(i as Field);\n }\n let hash = input.hash();\n dep::std::println(hash);\n assert(hash == 0x19b0d74feb06ebde19edd85a28986c97063e84b3b351a8b666c7cac963ce655f);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(\n 0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6,\n );\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd,\n ];\n let serialized_log = arr_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(\n 0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6,\n );\n let log = AztecAddress::from_field(\n 0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303,\n );\n let serialized_log: [u8; 32] = log.to_field().to_be_bytes();\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(\n 0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8,\n );\n let log = \"dummy\";\n let serialized_log = str_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(\n 0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8,\n );\n let log = \"Hello this is a string\";\n let serialized_log = str_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841);\n}\n"
2407
+ },
2408
+ "130": {
2409
+ "path": "/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr",
2410
+ "source": "use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\n hash::{ArgsHasher, hash_args_array},\n keys::constants::{NULLIFIER_INDEX, NUM_KEY_TYPES, OUTGOING_INDEX, sk_generators},\n messaging::process_l1_to_l2_message,\n oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, notify_set_min_revertible_side_effect_counter,\n set_public_teardown_function_call_internal,\n },\n header::get_header_at,\n key_validation_request::get_key_validation_request,\n logs::{emit_encrypted_event_log, emit_encrypted_note_log},\n returns::pack_returns,\n },\n};\nuse dep::protocol_types::{\n abis::{\n call_context::CallContext,\n function_selector::FunctionSelector,\n log_hash::{EncryptedLogHash, LogHash, NoteLogHash},\n max_block_number::MaxBlockNumber,\n note_hash::NoteHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_request::PublicCallRequest,\n read_request::ReadRequest,\n side_effect::Counted,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n },\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_CONTRACT_CLASS_LOGS_PER_CALL, MAX_ENCRYPTED_LOGS_PER_CALL, MAX_ENQUEUED_CALLS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL,\n MAX_NOTE_ENCRYPTED_LOGS_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NOTE_HASHES_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, PUBLIC_DISPATCH_SELECTOR,\n },\n header::Header,\n messaging::l2_to_l1_message::L2ToL1Message,\n traits::Empty,\n};\n\n// When finished, one can call .finish() to convert back to the abi\npub struct PrivateContext {\n // docs:start:private-context\n pub inputs: PrivateContextInputs,\n pub side_effect_counter: u32,\n\n pub min_revertible_side_effect_counter: u32,\n pub is_fee_payer: bool,\n\n pub args_hash: Field,\n pub return_hash: Field,\n\n pub max_block_number: MaxBlockNumber,\n\n pub note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n pub nullifier_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n key_validation_requests_and_generators: BoundedVec<KeyValidationRequestAndGenerator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL>,\n\n pub note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n pub nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n pub private_call_requests: BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n pub public_call_requests: BoundedVec<Counted<PublicCallRequest>, MAX_ENQUEUED_CALLS_PER_CALL>,\n pub public_teardown_call_request: PublicCallRequest,\n pub l2_to_l1_msgs: BoundedVec<L2ToL1Message, MAX_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n pub historical_header: Header,\n\n pub note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n pub encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_LOGS_PER_CALL>,\n pub contract_class_logs_hashes: BoundedVec<LogHash, MAX_CONTRACT_CLASS_LOGS_PER_CALL>,\n\n // Contains the last key validation request for each key type. This is used to cache the last request and avoid\n // fetching the same request multiple times.\n // The index of the array corresponds to the key type (0 nullifier, 1 incoming, 2 outgoing, 3 tagging).\n pub last_key_validation_requests: [Option<KeyValidationRequest>; NUM_KEY_TYPES],\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n historical_header: inputs.historical_header,\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n pub fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n }\n\n pub fn push_nullifier(&mut self, nullifier: Field) {\n self.nullifiers.push(\n Nullifier { value: nullifier, note_hash: 0, counter: self.next_counter() },\n );\n }\n\n pub fn push_nullifier_for_note_hash(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.nullifiers.push(\n Nullifier {\n value: nullifier,\n note_hash: nullified_note_hash,\n counter: self.next_counter(),\n },\n );\n }\n\n // Returns the header of a block whose state is used during private execution (not the block the transaction is\n // included in).\n pub fn get_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage(),\n nullifier_read_requests: self.nullifier_read_requests.storage(),\n key_validation_requests_and_generators: self\n .key_validation_requests_and_generators\n .storage(),\n note_hashes: self.note_hashes.storage(),\n nullifiers: self.nullifiers.storage(),\n private_call_requests: self.private_call_requests.storage(),\n public_call_requests: self.public_call_requests.storage(),\n public_teardown_call_request: self.public_teardown_call_request,\n l2_to_l1_msgs: self.l2_to_l1_msgs.storage(),\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage(),\n encrypted_logs_hashes: self.encrypted_logs_hashes.storage(),\n contract_class_logs_hashes: self.contract_class_logs_hashes.storage(),\n historical_header: self.historical_header,\n tx_context: self.inputs.tx_context,\n }\n }\n\n pub fn set_as_fee_payer(&mut self) {\n dep::protocol_types::debug_log::debug_log_format(\n \"Setting {0} as fee payer\",\n [self.this_address().to_field()],\n );\n self.is_fee_payer = true;\n }\n\n pub fn end_setup(&mut self) {\n // dep::protocol_types::debug_log::debug_log_format(\n // \"Ending setup at counter {0}\",\n // [self.side_effect_counter as Field]\n // );\n self.min_revertible_side_effect_counter = self.side_effect_counter;\n notify_set_min_revertible_side_effect_counter(self.min_revertible_side_effect_counter);\n }\n\n // docs:start:max-block-number\n pub fn set_tx_max_block_number(&mut self, max_block_number: u32) {\n // docs:end:max-block-number\n self.max_block_number =\n MaxBlockNumber::min_with_u32(self.max_block_number, max_block_number);\n }\n\n pub fn push_note_hash_read_request(&mut self, note_hash: Field) {\n let side_effect = ReadRequest { value: note_hash, counter: self.next_counter() };\n self.note_hash_read_requests.push(side_effect);\n }\n\n pub fn push_nullifier_read_request(&mut self, nullifier: Field) {\n let request = ReadRequest { value: nullifier, counter: self.next_counter() };\n self.nullifier_read_requests.push(request);\n }\n\n pub fn request_nsk_app(&mut self, npk_m_hash: Field) -> Field {\n self.request_sk_app(npk_m_hash, NULLIFIER_INDEX)\n }\n\n pub fn request_ovsk_app(&mut self, ovpk_m_hash: Field) -> Field {\n self.request_sk_app(ovpk_m_hash, OUTGOING_INDEX)\n }\n\n fn request_sk_app(&mut self, pk_m_hash: Field, key_index: Field) -> Field {\n let cached_request =\n self.last_key_validation_requests[key_index].unwrap_or(KeyValidationRequest::empty());\n\n if cached_request.pk_m.hash() == pk_m_hash {\n // We get a match so the cached request is the latest one\n cached_request.sk_app\n } else {\n // We didn't get a match meaning the cached result is stale\n // Typically we'd validate keys by showing that they are the preimage of `pk_m_hash`, but that'd require\n // the oracle returning the master secret keys, which could cause malicious contracts to leak it or learn\n // about secrets from other contracts. We therefore silo secret keys, and rely on the private kernel to\n // validate that we siloed secret key corresponds to correct siloing of the master secret key that hashes\n // to `pk_m_hash`.\n let request = unsafe { get_key_validation_request(pk_m_hash, key_index) };\n assert(request.pk_m.hash() == pk_m_hash);\n\n self.key_validation_requests_and_generators.push(\n KeyValidationRequestAndGenerator {\n request,\n sk_app_generator: sk_generators[key_index],\n },\n );\n self.last_key_validation_requests[key_index] = Option::some(request);\n request.sk_app\n }\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n // docs:end:context_message_portal\n let message = L2ToL1Message { recipient, content, counter: self.next_counter() };\n self.l2_to_l1_msgs.push(message);\n }\n\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\n // docs:end:context_consume_l1_to_l2_message\n let nullifier = process_l1_to_l2_message(\n self.historical_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret,\n leaf_index,\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n // docs:end:consume_l1_to_l2_message\n\n // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<let M: u32>(\n &mut self,\n randomness: Field,\n log: [u8; M],\n log_hash: Field,\n ) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<let M: u32>(\n &mut self,\n note_hash_counter: u32,\n log: [u8; M],\n log_hash: Field,\n ) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn static_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false)\n }\n\n pub fn static_call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> PackedReturns {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // The oracle simulates the private call and returns the value of the side effects counter after execution of\n // the call (which means that end_side_effect_counter - start_side_effect_counter is the number of side effects\n // that took place), along with the hash of the return values. We validate these by requesting a private kernel\n // iteration in which the return values are constrained to hash to `returns_hash` and the side effects counter\n // to increment from start to end.\n let (end_side_effect_counter, returns_hash) = unsafe {\n call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n )\n };\n\n self.private_call_requests.push(\n PrivateCallRequest {\n call_context: CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n },\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter,\n },\n );\n\n // TODO (fees) figure out why this crashes the prover and enable it\n // we need this in order to pay fees inside child call contexts\n // assert(\n // (item.public_inputs.min_revertible_side_effect_counter == 0 as u32)\n // | (item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter)\n // );\n // if item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter {\n // self.min_revertible_side_effect_counter = item.public_inputs.min_revertible_side_effect_counter;\n // }\n self.side_effect_counter = end_side_effect_counter + 1;\n PackedReturns::new(returns_hash)\n }\n\n pub fn call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn static_call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false)\n }\n\n pub fn static_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n );\n\n // Public calls are rerouted through the dispatch function.\n let function_selector = comptime { FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR) };\n\n let call_request = PublicCallRequest {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n args_hash,\n };\n\n self.public_call_requests.push(Counted::new(call_request, counter));\n }\n\n pub fn set_public_teardown_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.set_public_teardown_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn set_public_teardown_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n );\n\n let function_selector = comptime { FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR) };\n\n self.public_teardown_call_request = PublicCallRequest {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n args_hash,\n };\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n}\n"
2411
+ },
2412
+ "225": {
2413
+ "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr",
2414
+ "source": "/// Utility function to console.log data in the acir simulator.\n/// Example:\n/// debug_log(\"blah blah this is a debug string\");\npub fn debug_log<let N: u32>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n\n/// Utility function to console.log data in the acir simulator. This variant receives a format string in which the\n/// `${k}` tokens will be replaced with the k-eth value in the `args` array.\n/// Examples:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole array: {}\", [e1, e2, e3, e4]);\npub fn debug_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe { debug_log_oracle_wrapper(msg, args) };\n}\n\npub unconstrained fn debug_log_oracle_wrapper<let M: u32, let N: u32>(\n msg: str<M>,\n args: [Field; N],\n) {\n debug_log_oracle(msg, args.as_slice());\n}\n\n// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: \"solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155\"`\n#[oracle(debugLog)]\nunconstrained fn debug_log_oracle<let M: u32>(_msg: str<M>, args: [Field]) {}\n"
2415
+ },
2416
+ "286": {
2417
+ "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/public_keys.nr",
2418
+ "source": "use crate::{\n address::public_keys_hash::PublicKeysHash,\n constants::{\n DEFAULT_IVPK_M_X, DEFAULT_IVPK_M_Y, DEFAULT_NPK_M_X, DEFAULT_NPK_M_Y, DEFAULT_OVPK_M_X,\n DEFAULT_OVPK_M_Y, DEFAULT_TPK_M_X, DEFAULT_TPK_M_Y, GENERATOR_INDEX__PUBLIC_KEYS_HASH,\n },\n hash::poseidon2_hash_with_separator,\n point::POINT_LENGTH,\n traits::{Deserialize, Hash, Serialize},\n};\n\nuse dep::std::embedded_curve_ops::EmbeddedCurvePoint as Point;\nuse std::default::Default;\n\npub global PUBLIC_KEYS_LENGTH: u32 = 12;\n\npub struct PublicKeys {\n pub npk_m: NpkM,\n pub ivpk_m: IvpkM,\n pub ovpk_m: OvpkM,\n pub tpk_m: TpkM,\n}\n\npub trait ToPoint {\n fn to_point(self) -> Point;\n}\n\npub struct NpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for NpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for NpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\n// Note: If we store npk_m_hash directly we can remove this trait implementation. See #8091\nimpl Hash for NpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\npub struct IvpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for IvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for IvpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\npub struct OvpkM {\n pub inner: Point,\n}\n\nimpl Hash for OvpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\nimpl ToPoint for OvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for OvpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\npub struct TpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for TpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for TpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\nimpl Default for PublicKeys {\n fn default() -> Self {\n PublicKeys {\n npk_m: NpkM {\n inner: Point { x: DEFAULT_NPK_M_X, y: DEFAULT_NPK_M_Y, is_infinite: false },\n },\n ivpk_m: IvpkM {\n inner: Point { x: DEFAULT_IVPK_M_X, y: DEFAULT_IVPK_M_Y, is_infinite: false },\n },\n ovpk_m: OvpkM {\n inner: Point { x: DEFAULT_OVPK_M_X, y: DEFAULT_OVPK_M_Y, is_infinite: false },\n },\n tpk_m: TpkM {\n inner: Point { x: DEFAULT_TPK_M_X, y: DEFAULT_TPK_M_Y, is_infinite: false },\n },\n }\n }\n}\n\nimpl Eq for PublicKeys {\n fn eq(self, other: PublicKeys) -> bool {\n (self.npk_m.inner == other.npk_m.inner)\n & (self.ivpk_m.inner == other.ivpk_m.inner)\n & (self.ovpk_m.inner == other.ovpk_m.inner)\n & (self.tpk_m.inner == other.tpk_m.inner)\n }\n}\n\nimpl PublicKeys {\n pub fn hash(self) -> PublicKeysHash {\n PublicKeysHash::from_field(poseidon2_hash_with_separator(\n self.serialize(),\n GENERATOR_INDEX__PUBLIC_KEYS_HASH as Field,\n ))\n }\n}\n\nimpl Serialize<PUBLIC_KEYS_LENGTH> for PublicKeys {\n fn serialize(self) -> [Field; PUBLIC_KEYS_LENGTH] {\n [\n self.npk_m.inner.x,\n self.npk_m.inner.y,\n self.npk_m.inner.is_infinite as Field,\n self.ivpk_m.inner.x,\n self.ivpk_m.inner.y,\n self.ivpk_m.inner.is_infinite as Field,\n self.ovpk_m.inner.x,\n self.ovpk_m.inner.y,\n self.ovpk_m.inner.is_infinite as Field,\n self.tpk_m.inner.x,\n self.tpk_m.inner.y,\n self.tpk_m.inner.is_infinite as Field,\n ]\n }\n}\n\nimpl Deserialize<PUBLIC_KEYS_LENGTH> for PublicKeys {\n fn deserialize(serialized: [Field; PUBLIC_KEYS_LENGTH]) -> PublicKeys {\n PublicKeys {\n npk_m: NpkM {\n inner: Point {\n x: serialized[0],\n y: serialized[1],\n is_infinite: serialized[2] as bool,\n },\n },\n ivpk_m: IvpkM {\n inner: Point {\n x: serialized[3],\n y: serialized[4],\n is_infinite: serialized[5] as bool,\n },\n },\n ovpk_m: OvpkM {\n inner: Point {\n x: serialized[6],\n y: serialized[7],\n is_infinite: serialized[8] as bool,\n },\n },\n tpk_m: TpkM {\n inner: Point {\n x: serialized[9],\n y: serialized[10],\n is_infinite: serialized[11] as bool,\n },\n },\n }\n }\n}\n\npub struct AddressPoint {\n pub inner: Point,\n}\n\nimpl ToPoint for AddressPoint {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[test]\nunconstrained fn compute_public_keys_hash() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let actual = keys.hash();\n let expected_public_keys_hash =\n 0x0fecd9a32db731fec1fded1b9ff957a1625c069245a3613a2538bd527068b0ad;\n\n assert(actual.to_field() == expected_public_keys_hash);\n}\n\n#[test]\nunconstrained fn compute_default_hash() {\n let keys = PublicKeys::default();\n\n let actual = keys.hash();\n let test_data_default_hash = 0x1d3bf1fb93ae0e9cda83b203dd91c3bfb492a9aecf30ec90e1057eced0f0e62d;\n\n assert(actual.to_field() == test_data_default_hash);\n}\n\n#[test]\nunconstrained fn test_public_keys_serialization() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let serialized = keys.serialize();\n let deserialized = PublicKeys::deserialize(serialized);\n\n assert_eq(keys.npk_m.inner.x, deserialized.npk_m.inner.x);\n assert_eq(keys.npk_m.inner.y, deserialized.npk_m.inner.y);\n assert_eq(keys.ivpk_m.inner.x, deserialized.ivpk_m.inner.x);\n assert_eq(keys.ivpk_m.inner.y, deserialized.ivpk_m.inner.y);\n assert_eq(keys.ovpk_m.inner.x, deserialized.ovpk_m.inner.x);\n assert_eq(keys.ovpk_m.inner.y, deserialized.ovpk_m.inner.y);\n assert_eq(keys.tpk_m.inner.x, deserialized.tpk_m.inner.x);\n assert_eq(keys.tpk_m.inner.y, deserialized.tpk_m.inner.y);\n}\n"
2419
+ },
2420
+ "291": {
2421
+ "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr",
2422
+ "source": "use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector,\n log_hash::{LogHash, ScopedEncryptedLogHash, ScopedLogHash},\n note_hash::ScopedNoteHash,\n nullifier::ScopedNullifier,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__UNIQUE_NOTE_HASH,\n },\n merkle_tree::root::root_from_sibling_path,\n messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message},\n traits::{is_empty, ToField},\n utils::field::field_from_bytes_32_trunc,\n};\nuse super::utils::field::field_from_bytes;\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = std::hash::sha256(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\nfn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field {\n // Hashing tx hash with note index in tx is guaranteed to be unique\n poseidon2_hash_with_separator(\n [tx_hash, note_index_in_tx as Field],\n GENERATOR_INDEX__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, note_hash: Field) -> Field {\n let inputs = [nonce, note_hash];\n poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), unique_note_hash],\n GENERATOR_INDEX__SILOED_NOTE_HASH,\n )\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: ScopedNoteHash, tx_hash: Field, note_index_in_tx: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx);\n let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value());\n compute_siloed_note_hash(note_hash.contract_address, unique_note_hash)\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), nullifier],\n GENERATOR_INDEX__OUTER_NULLIFIER,\n )\n}\n\npub fn silo_nullifier(nullifier: ScopedNullifier) -> Field {\n if nullifier.contract_address.is_zero() {\n nullifier.value() // Return value instead of 0 because the first nullifier's contract address is zero.\n } else {\n compute_siloed_nullifier(nullifier.contract_address, nullifier.value())\n }\n}\n\npub fn silo_encrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n // We assume contract address has already been masked\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n accumulate_sha256(\n [log_hash.contract_address.to_field(), log_hash.log_hash.value],\n )\n }\n}\n\npub fn mask_encrypted_log_hash(scoped_log: ScopedEncryptedLogHash) -> AztecAddress {\n if scoped_log.contract_address.is_zero() {\n AztecAddress::from_field(0)\n } else if (scoped_log.log_hash.randomness == 0) {\n scoped_log.contract_address\n } else {\n AztecAddress::from_field(poseidon2_hash_with_separator(\n [scoped_log.contract_address.to_field(), scoped_log.log_hash.randomness],\n 0,\n ))\n }\n}\n\nfn compute_siloed_unencrypted_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_unencrypted_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs =\n [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes: [u8; 32] = inputs[i].to_be_bytes();\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage())\n}\n\npub fn silo_l2_to_l1_message(\n msg: ScopedL2ToL1Message,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.message.recipient,\n msg.message.content,\n rollup_version_id,\n chain_id,\n )\n }\n}\n\n// Computes sha256 hash of 2 input hashes.\n//\n// NB: This method now takes in two 31 byte fields - it assumes that any input\n// is the result of a sha_to_field hash and => is truncated\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\npub fn accumulate_sha256(input: [Field; 2]) -> Field {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually\n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field\n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n // Concatentate two fields into 32x2 = 64 bytes\n // accumulate_sha256 assumes that the inputs are pre-truncated 31 byte numbers\n let mut hash_input_flattened = [0; 64];\n for offset in 0..input.len() {\n let input_as_bytes: [u8; 32] = input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n sha256_to_field(hash_input_flattened)\n}\n\n// Computes the final logs hash for a tx.\npub fn compute_tx_logs_hash<let N: u32>(logs: [LogHash; N]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; N * 32];\n for offset in 0..N {\n // TODO: This is not checking that the decomposition is smaller than P\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_radix(256);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn verification_key_hash<let N: u32>(key: [Field; N]) -> Field {\n crate::hash::poseidon2_hash(key)\n}\n\n#[inline_always]\npub fn pedersen_hash<let N: u32>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of N + 1\n let in_len = N + 1;\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\npub fn poseidon2_hash_with_separator_slice<T>(inputs: [Field], separator: T) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of Math.ceil(N/31)\n let mut in_len = N / 31;\n let mut has_padding = false;\n if N % 31 != 0 {\n in_len += 1;\n has_padding = true;\n }\n\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n sponge.absorb(field_from_bytes(current_field, false));\n current_field = [0; 31];\n }\n }\n if has_padding {\n sponge.absorb(field_from_bytes(current_field, false));\n }\n\n sponge.squeeze()\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = std::hash::sha256(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result =\n compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(\n AztecAddress::from_field(1),\n EthAddress::from_field(3),\n 5,\n 2,\n 4,\n );\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n ScopedL2ToL1Message {\n message: L2ToL1Message { recipient: EthAddress::from_field(1), content: 2, counter: 0 },\n contract_address: AztecAddress::from_field(3),\n },\n version,\n chainId,\n );\n\n // The following value was generated by `l2_to_l1_message.test.ts`\n let hash_from_typescript = 0x00c6155d69febb9d5039b374dd4f77bf57b7c881709aa524a18acaa0bd57476a;\n\n assert_eq(hash, hash_from_typescript);\n}\n"
2423
+ },
2424
+ "307": {
2425
+ "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/salted_initialization_hash.nr",
2426
+ "source": "use crate::{\n address::aztec_address::AztecAddress, constants::GENERATOR_INDEX__PARTIAL_ADDRESS,\n hash::poseidon2_hash_with_separator, traits::ToField,\n};\n\n// Salted initialization hash. Used in the computation of a partial address.\npub struct SaltedInitializationHash {\n pub inner: Field,\n}\n\nimpl ToField for SaltedInitializationHash {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl SaltedInitializationHash {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(salt: Field, initialization_hash: Field, deployer: AztecAddress) -> Self {\n SaltedInitializationHash::from_field(poseidon2_hash_with_separator(\n [salt, initialization_hash, deployer.to_field()],\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n ))\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"
2427
+ },
2428
+ "308": {
2429
+ "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/partial_address.nr",
2430
+ "source": "use crate::{\n address::{aztec_address::AztecAddress, salted_initialization_hash::SaltedInitializationHash},\n constants::GENERATOR_INDEX__PARTIAL_ADDRESS,\n contract_class_id::ContractClassId,\n hash::poseidon2_hash_with_separator,\n traits::{Deserialize, Serialize, ToField},\n};\n\nglobal PARTIAL_ADDRESS_LENGTH: u32 = 1;\n\n// Partial address\npub struct PartialAddress {\n pub inner: Field,\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn serialize(self: Self) -> [Field; PARTIAL_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn deserialize(fields: [Field; PARTIAL_ADDRESS_LENGTH]) -> Self {\n PartialAddress { inner: fields[0] }\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(\n contract_class_id: ContractClassId,\n salt: Field,\n initialization_hash: Field,\n deployer: AztecAddress,\n ) -> Self {\n PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n SaltedInitializationHash::compute(salt, initialization_hash, deployer),\n )\n }\n\n pub fn compute_from_salted_initialization_hash(\n contract_class_id: ContractClassId,\n salted_initialization_hash: SaltedInitializationHash,\n ) -> Self {\n PartialAddress::from_field(poseidon2_hash_with_separator(\n [contract_class_id.to_field(), salted_initialization_hash.to_field()],\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n ))\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn is_zero(self) -> bool {\n self.to_field() == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"
2431
+ },
2432
+ "310": {
2433
+ "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr",
2434
+ "source": "use crate::{\n abis::function_selector::FunctionSelector,\n address::{\n partial_address::PartialAddress, salted_initialization_hash::SaltedInitializationHash,\n },\n constants::{\n AZTEC_ADDRESS_LENGTH, FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__CONTRACT_ADDRESS_V1,\n MAX_FIELD_VALUE,\n },\n contract_class_id::ContractClassId,\n hash::{poseidon2_hash_with_separator, private_functions_root_from_siblings},\n merkle_tree::membership::MembershipWitness,\n public_keys::{IvpkM, NpkM, OvpkM, PublicKeys, TpkM},\n traits::{Deserialize, Empty, FromField, Serialize, ToField},\n utils,\n};\n\n// We do below because `use crate::point::Point;` does not work\nuse dep::std::embedded_curve_ops::EmbeddedCurvePoint as Point;\n\nuse crate::public_keys::AddressPoint;\nuse std::{\n ec::{pow, sqrt},\n embedded_curve_ops::{EmbeddedCurveScalar, fixed_base_scalar_mul as derive_public_key},\n};\n\n// Aztec address\npub struct AztecAddress {\n pub inner: Field,\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other: Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn to_address_point(self) -> AddressPoint {\n // We compute the address point by taking our address, setting it to x, and then solving for y in the\n // equation which defines our bn curve:\n // y^2 = x^3 - 17; x = address\n let x = self.inner;\n let y_squared = pow(x, 3) - 17;\n\n // TODO (#8970): Handle cases where we cannot recover a point from an address\n let mut y = sqrt(y_squared);\n\n // If we get a negative y coordinate (any y where y > MAX_FIELD_VALUE / 2), we pin it to the\n // positive one (any value where y <= MAX_FIELD_VALUE / 2) by subtracting it from the Field modulus\n // note: The field modulus is MAX_FIELD_VALUE + 1\n if (!(y.lt(MAX_FIELD_VALUE / 2) | y.eq(MAX_FIELD_VALUE / 2))) {\n y = (MAX_FIELD_VALUE + 1) - y;\n }\n\n AddressPoint { inner: Point { x: self.inner, y, is_infinite: false } }\n }\n\n pub fn compute(public_keys: PublicKeys, partial_address: PartialAddress) -> AztecAddress {\n let public_keys_hash = public_keys.hash();\n\n let pre_address = poseidon2_hash_with_separator(\n [public_keys_hash.to_field(), partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS_V1,\n );\n\n let address_point = derive_public_key(EmbeddedCurveScalar::from_field(pre_address)).add(\n public_keys.ivpk_m.to_point(),\n );\n\n // Note that our address is only the x-coordinate of the full address_point. This is okay because when people want to encrypt something and send it to us\n // they can recover our full point using the x-coordinate (our address itself). To do this, they recompute the y-coordinate according to the equation y^2 = x^3 - 17.\n // When they do this, they may get a positive y-coordinate (a value that is less than or equal to MAX_FIELD_VALUE / 2) or\n // a negative y-coordinate (a value that is more than MAX_FIELD_VALUE), and we cannot dictate which one they get and hence the recovered point may sometimes be different than the one\n // our secrect can decrypt. Regardless though, they should and will always encrypt using point with the positive y-coordinate by convention.\n // This ensures that everyone encrypts to the same point given an arbitrary x-coordinate (address). This is allowed because even though our original point may not have a positive y-coordinate,\n // with our original secret, we will be able to derive the secret to the point with the flipped (and now positive) y-coordinate that everyone encrypts to.\n AztecAddress::from_field(address_point.x)\n }\n\n pub fn compute_from_private_function(\n function_selector: FunctionSelector,\n function_vk_hash: Field,\n function_leaf_membership_witness: MembershipWitness<FUNCTION_TREE_HEIGHT>,\n contract_class_artifact_hash: Field,\n contract_class_public_bytecode_commitment: Field,\n salted_initialization_hash: SaltedInitializationHash,\n public_keys: PublicKeys,\n ) -> Self {\n let private_functions_root = private_functions_root_from_siblings(\n function_selector,\n function_vk_hash,\n function_leaf_membership_witness.leaf_index,\n function_leaf_membership_witness.sibling_path,\n );\n\n let contract_class_id = ContractClassId::compute(\n contract_class_artifact_hash,\n private_functions_root,\n contract_class_public_bytecode_commitment,\n );\n\n // Compute contract address using the preimage which includes the class_id.\n let partial_address = PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n salted_initialization_hash,\n );\n\n AztecAddress::compute(public_keys, partial_address)\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys() {\n let public_keys = PublicKeys {\n npk_m: NpkM {\n inner: Point {\n x: 0x22f7fcddfa3ce3e8f0cc8e82d7b94cdd740afa3e77f8e4a63ea78a239432dcab,\n y: 0x0471657de2b6216ade6c506d28fbc22ba8b8ed95c871ad9f3e3984e90d9723a7,\n is_infinite: false,\n },\n },\n ivpk_m: IvpkM {\n inner: Point {\n x: 0x111223493147f6785514b1c195bb37a2589f22a6596d30bb2bb145fdc9ca8f1e,\n y: 0x273bbffd678edce8fe30e0deafc4f66d58357c06fd4a820285294b9746c3be95,\n is_infinite: false,\n },\n },\n ovpk_m: OvpkM {\n inner: Point {\n x: 0x09115c96e962322ffed6522f57194627136b8d03ac7469109707f5e44190c484,\n y: 0x0c49773308a13d740a7f0d4f0e6163b02c5a408b6f965856b6a491002d073d5b,\n is_infinite: false,\n },\n },\n tpk_m: TpkM {\n inner: Point {\n x: 0x00d3d81beb009873eb7116327cf47c612d5758ef083d4fda78e9b63980b2a762,\n y: 0x2f567d22d2b02fe1f4ad42db9d58a36afd1983e7e2909d1cab61cafedad6193a,\n is_infinite: false,\n },\n },\n };\n\n let partial_address = PartialAddress::from_field(\n 0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de,\n );\n\n let address = AztecAddress::compute(public_keys, partial_address);\n\n // The following value was generated by `derivation.test.ts`.\n // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data.\n let expected_computed_address_from_partial_and_pubkeys =\n 0x24e4646f58b9fbe7d38e317db8d5636c423fbbdfbe119fc190fe9c64747e0c62;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkeys);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"
2435
+ },
2436
+ "377": {
2437
+ "path": "/usr/src/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr",
2438
+ "source": "use dep::aztec::macros::aztec;\n\n#[aztec]\ncontract ContractInstanceDeployer {\n use dep::aztec::{\n macros::{events::event, functions::private},\n utils::to_bytes::arr_to_be_bytes_arr,\n };\n use dep::aztec::protocol_types::{\n address::{AztecAddress, PartialAddress, PublicKeysHash},\n constants::DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n contract_class_id::ContractClassId,\n hash::sha256_to_field,\n public_keys::PublicKeys,\n traits::Serialize,\n };\n use std::meta::derive;\n\n #[event]\n #[derive(Serialize)]\n struct ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE: Field,\n address: AztecAddress,\n version: u8,\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys: PublicKeys,\n deployer: AztecAddress,\n }\n\n // We need to impl this separately because ts deserializes a point as two fields only.\n // We had issues that:\n // Notice how the 'is_infinite' field is deserialized as the next point.\n // {\n // masterNullifierPublicKey: Point {\n // x: Fr<0x0000000000000000000000000000000000000000000000000000000000000012>,\n // y: Fr<0x0000000000000000000000000000000000000000000000000000000000000034>,\n // isInfinite: false,\n // kind: 'point'\n // },\n // masterIncomingViewingPublicKey: Point {\n // x: Fr<0x0000000000000000000000000000000000000000000000000000000000000000>,\n // y: Fr<0x0000000000000000000000000000000000000000000000000000000000000056>,\n // isInfinite: false,\n // kind: 'point'\n // },\n // masterOutgoingViewingPublicKey: Point {\n // x: Fr<0x0000000000000000000000000000000000000000000000000000000000000078>,\n // y: Fr<0x0000000000000000000000000000000000000000000000000000000000000000>,\n // isInfinite: false,\n // kind: 'point'\n // },\n // masterTaggingPublicKey: Point {\n // x: Fr<0x0000000000000000000000000000000000000000000000000000000000000910>,\n // y: Fr<0x0000000000000000000000000000000000000000000000000000000000001112>,\n // isInfinite: false,\n // kind: 'point'\n // }\n impl Serialize<15> for ContractInstanceDeployed {\n fn serialize(self) -> [Field; 15] {\n [\n self.DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n self.address.to_field(),\n self.version.to_field(),\n self.salt,\n self.contract_class_id.to_field(),\n self.initialization_hash,\n self.public_keys.npk_m.serialize()[0],\n self.public_keys.npk_m.serialize()[1],\n self.public_keys.ivpk_m.serialize()[0],\n self.public_keys.ivpk_m.serialize()[1],\n self.public_keys.ovpk_m.serialize()[0],\n self.public_keys.ovpk_m.serialize()[1],\n self.public_keys.tpk_m.serialize()[0],\n self.public_keys.tpk_m.serialize()[1],\n self.deployer.to_field(),\n ]\n }\n }\n\n #[private]\n fn deploy(\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys: PublicKeys,\n universal_deploy: bool,\n ) {\n // TODO(@spalladino): assert nullifier_exists silo(contract_class_id, ContractClassRegisterer)\n let deployer = if universal_deploy {\n AztecAddress::zero()\n } else {\n context.msg_sender()\n };\n\n let partial_address =\n PartialAddress::compute(contract_class_id, salt, initialization_hash, deployer);\n\n let address = AztecAddress::compute(public_keys, partial_address);\n\n // Emit the address as a nullifier to be able to prove that this instance has been (not) deployed\n context.push_nullifier(address.to_field());\n\n // Broadcast the event\n let event = ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n contract_class_id,\n address,\n public_keys,\n initialization_hash,\n salt,\n deployer,\n version: 1,\n };\n\n let payload = event.serialize();\n dep::aztec::oracle::debug_log::debug_log_format(\"ContractInstanceDeployed: {}\", payload);\n\n // @todo This is very inefficient, we are doing a lot of back and forth conversions.\n let serialized_log = arr_to_be_bytes_arr(payload);\n let log_hash = sha256_to_field(serialized_log);\n\n // Note: we are cheating a bit here because this is actually not encrypted\n // but needs to be emitted from private, where we have removed unencrypted_logs,\n // and has 15 fields (the max enc log len is 8).\n // TODO(Miranda): split into 2 logs\n context.emit_raw_event_log_with_masked_address(0, serialized_log, log_hash);\n }\n}\n"
2439
+ }
2440
+ }
2441
+ }